c++11 - QTextDocument::print 中的段错误

标签 c++11 ubuntu pdf printing qt5

我遇到了一个非常奇怪的段错误,我不明白原因。

上下文:在控制台 QT 应用程序中,我需要创建一个包含一些信息的 PDF 文件,但 PDF 生成会导致段错误。 我将初始代码简化为主要函数和一个方法。

qt .pro 文件:

CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
QT  += core
QT  += gui # need for pdf generation
QT  += printsupport #need for pdf generation

main.cpp

int main(int argc, char *argv[])
{
    QCoreApplication::setSetuidAllowed(true);
    QCoreApplication app(argc, argv);
    CPdfCreationDryRun pdfCreate(&app);
    QTimer::singleShot(0, &pdfCreate, SLOT(start()));
    return app.exec();
}

测试.cpp

void CPdfCreationDryRun::start()
{
    QTextDocument doc {};
    const QString msg {"<p>toto</p>"};
    doc.setHtml(msg);
    const QString pdfFileName {"toto.pdf"};

    QPrinter printer {QPrinter::PrinterResolution};
    printer.setPageSize(QPrinter::A4);
    printer.setOrientation(QPrinter::Portrait);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName(pdfFileName);
    printer.setFontEmbeddingEnabled(true);

    doc.print(&printer);
}

gdb 回溯

#0  0x00007f5cfec7bc42 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#1  0x00007f5cfec7f2cd in QFontDatabase::findFont(QFontDef const&, int) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#2  0x00007f5cfec7faf6 in QFontDatabase::load(QFontPrivate const*, int) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#3  0x00007f5cfec553b3 in QFontPrivate::engineForScript(int) const () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#4  0x00007f5cfec86cf9 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#5  0x00007f5cfeca0006 in QTextLine::layout_helper(int) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#6  0x00007f5cfeca1840 in QTextLine::setLineWidth(double) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#7  0x00007f5cfece4d3d in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#8  0x00007f5cfece5845 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#9  0x00007f5cfeceac3d in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#10 0x00007f5cfeceb0b9 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#11 0x00007f5cfeceb2b8 in QTextDocumentLayout::doLayout(int, int, int) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#12 0x00007f5cfecebde1 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#13 0x00007f5cfecec789 in QTextDocumentLayout::documentChanged(int, int, int) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#14 0x00007f5cfecb6bc6 in QTextDocument::documentLayout() const () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#15 0x00007f5cfecbe1ed in QTextDocument::print(QPagedPaintDevice*) const () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#16 0x0000559445993520 in CPdfCreationDryRun::start (this=0x7ffc7ea14be0) at

valgrind 日志:

==82570== Invalid read of size 8
==82570==    at 0x54A8C42: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54AC2CC: QFontDatabase::findFont(QFontDef const&, int) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54ACAF5: QFontDatabase::load(QFontPrivate const*, int) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54823B2: QFontPrivate::engineForScript(int) const (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54B7617: QTextEngine::fontEngine(QScriptItem const&, QFixed*, QFixed*, QFixed*) const (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54B8708: QTextEngine::shapeText(int) const (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54B93EE: QTextEngine::shape(int) const (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54CDDFB: QTextLine::layout_helper(int) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54CE83F: QTextLine::setLineWidth(double) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x5511D3C: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x5512844: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x5517C3C: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==82570== 
==82570== 
==82570== Process terminating with default action of signal 11 (SIGSEGV)
==82570==  Access not within mapped region at address 0x0
==82570==    at 0x54A8C42: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54AC2CC: QFontDatabase::findFont(QFontDef const&, int) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54ACAF5: QFontDatabase::load(QFontPrivate const*, int) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54823B2: QFontPrivate::engineForScript(int) const (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54B7617: QTextEngine::fontEngine(QScriptItem const&, QFixed*, QFixed*, QFixed*) const (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54B8708: QTextEngine::shapeText(int) const (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54B93EE: QTextEngine::shape(int) const (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54CDDFB: QTextLine::layout_helper(int) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x54CE83F: QTextLine::setLineWidth(double) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x5511D3C: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x5512844: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)
==82570==    by 0x5517C3C: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.9.5)

我尝试将 QT_QPA_FONTDIR 环境变量重新定义为包含字体的不同目录,但这并没有改变行为。

EDIT1:我尝试不使用“printer.setFontEmbeddingEnabled()”,但它没有改变行为。

EDIT2:文档变量内容:

doc.toHtml: "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\np, li { white-space: pre-wrap; }\n</style></head><body style=\" font-family:''; font-weight:400; font-style:normal;\">\n<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">toto</p></body></html>"

doc.toPlainText: "toto"

doc.toRaw: "toto"

主机配置:

Linux ubuntu 4.18.0-25-generic #26~18.04.1-Ubuntu SMP Thu Jun 27 07:28:31 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

g++ --version g++ (Ubuntu 8.3.0-6ubuntu1~18.04.1) 8.3.0

QT: 5.9.5-0ubuntu1

我正在寻找任何帮助来理解观察到的行为以及如何解决它。

感谢和问候,

最佳答案

我找到了解决方法:我替换了

QCoreApplication

QApplication

然后重建...并且它有效:'(

关于c++11 - QTextDocument::print 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57329042/

相关文章:

android - 在 Android 上显示通过 POST 响应/下载收到的 PDF 文件

css - Chrome "Save to PDF"边距背景颜色?

c++ - 如何使用 std::vector<std::tuple<A,B>> 来管理内存(调整大小、保留...),但实际上保持 B 之前的 As 连续

c++ - 将函数模板传递给具有任意参数列表的函数模板

c++ - 在构造函数初始化器中初始化成员数组

ubuntu - 在 guest 操作系统 Ubuntu 中使用 virtualbox 内部网络

ubuntu - 尝试制作时出现opencv安装错误

c++ - 没有默认构造函数的重复元素模板化数组

macos - 将 git 存储库和文件从 Ubuntu 移动到 OS-X

javascript - 无法使用ember在浏览器中读取pdf内容