【问题标题】:mupdf on linux segmentation fault关于linux分段错误的mupdf
【发布时间】:2020-11-30 20:32:24
【问题描述】:

我有一个运行Ubuntu 1804x64的操作系统,安装在VMware中,使用Mupdf1.17构建成功,Qt版本是5.9.8,通过命令安装 sudo apt-get install qt5-default qtcreator

我的代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"


#include <QMessageBox>
#include <QDebug>
#include <QImage>
#include <QPixmap>
#include <QLabel>


#include "mupdf/fitz.h"
#include "mupdf/pdf.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    char *input = const_cast< char* >("/home/john/work/123.pdf");
    float zoom, rotate;
    int page_number, page_count;
    fz_context *ctx;
    fz_document *doc;
    fz_pixmap *pix;
    fz_matrix ctm;//0

    int x, y;

    page_number=0;
    //100%
    zoom=100;
    //0
    rotate=0;

       //
       ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
           if (!ctx)
           {
               qDebug()<<stderr<<"cannot create mupdf context";
               return;
           }

       //
       fz_try(ctx)
               fz_register_document_handlers(ctx);
       fz_catch(ctx)
       {
           qDebug()<<stderr<<"cannot register document handlers:"<< fz_caught_message(ctx);
           fz_drop_context(ctx);
           return;
       }



       //
       fz_try(ctx)
           doc = fz_open_document(ctx, input);
       fz_catch(ctx)
       {
           qDebug()<<stderr<< "cannot open document:"<< fz_caught_message(ctx);
           fz_drop_context(ctx);
           return;
       }

       //
       fz_try(ctx)
           page_count = fz_count_pages(ctx, doc);
       fz_catch(ctx)
       {
           qDebug()<<stderr<< "cannot count number of pages:"<< fz_caught_message(ctx);
           fz_drop_document(ctx, doc);
           fz_drop_context(ctx);
           return;
       }

        QString str;
        str = str.setNum(page_count);
        ui->textlabel->setText(str);


       if (page_number < 0 || page_number >= page_count)
       {
           qDebug()<<stderr<< "page number out of range: "<< page_number + 1<<"page count:"<<page_count;
           fz_drop_document(ctx, doc);
           fz_drop_context(ctx);
           return;
       }



       //
       ctm=fz_scale(zoom / 100, zoom / 100);
       ctm=fz_pre_rotate(ctm, rotate);



       //pixmap
       fz_try(ctx)
           pix = fz_new_pixmap_from_page_number(ctx, doc, page_number, ctm, fz_device_rgb(ctx), 0);
       fz_catch(ctx)
       {
           qDebug()<<stderr<< "cannot render page: %s\n"<< fz_caught_message(ctx);
           fz_drop_document(ctx, doc);
           fz_drop_context(ctx);
           return;
       }

        //
        //unsigned char *samples = fz_pixmap_samples(ctx, pix);
        unsigned char *samples = pix->samples;
        int width = fz_pixmap_width(ctx, pix);
        int height = fz_pixmap_height(ctx, pix);

        str = str.setNum(width);
        QString wid;
        wid=wid.setNum(width);
        ui->widthlabel->setText("width: "+wid);

        QString hei;
        hei=hei.setNum(height);
        ui->heightlabel->setText("height: "+hei);

        QImage image(samples, width, height,pix->stride,QImage::Format_RGB888);
        QLabel *label=new QLabel;
        label->setPixmap(QPixmap::fromImage(image));

        ui->layout->addWidget(label); // if (!image.save("a.png")) { // return; // } //

        ui->textlabel->setText("Pdf open success");

        fz_drop_pixmap(ctx, pix);
        fz_drop_document(ctx, doc);
        fz_drop_context(ctx);


}

MainWindow::~MainWindow()
{
    delete ui;
}


发生分段错误。奇怪的是我安装了Qt5.14.2.运行官方安装包,然后用Qt5.14重建然后程序运行正确没有分段错误。

我现在真正的环境是一个ARM架构的Linux系统,没有官方安装包安装qt只能通过命令安装。是 Qt 错误吗?

1   do_scavenging_malloc                                                                                                      0x44b5f0       
2   fz_calloc_no_throw                                                                                                        0x44b75e       
3   hb_face_create_for_tables                                                                                                 0x642237       
4   hb_qt_face_get_for_engine(QFontEngine *)                                                                                  0x7ffff76712ea 
5   QFontEngine::harfbuzzFace() const                                                                                         0x7ffff75b9e00 
6   ??                                                                                                                        0x7ffff3ca2447 
7   ??                                                                                                                        0x7ffff3ca6f3a 
8   ??                                                                                                                        0x7ffff3caba57 
9   ??                                                                                                                        0x7ffff75d7244 
10  QFontDatabase::findFont(QFontDef const&, int)                                                                             0x7ffff75d7760 
11  QFontDatabase::load(QFontPrivate const *, int)                                                                            0x7ffff75d7e26 
12  QFontPrivate::engineForScript(int) const                                                                                  0x7ffff75ab9ab 
13  QFontMetricsF::leading() const                                                                                            0x7ffff75cd0a1 
14  ??                                                                                                                        0x7ffff775f22f 
15  QPainter::drawText(QRect const&, int, QString const&, QRect *)                                                            0x7ffff7760206 
16  QStyle::drawItemText(QPainter *, QRect const&, int, QPalette const&, bool, QString const&, QPalette::ColorRole) const     0x7ffff7b42774 
17  chameleon::ChameleonStyle::drawControl(QStyle::ControlElement, QStyleOption const *, QPainter *, QWidget const *) const   0x7ffff145260e 
18  chameleon::ChameleonStyle::drawControl(QStyle::ControlElement, QStyleOption const *, QPainter *, QWidget const *) const   0x7ffff1452351 
19  QPushButton::paintEvent(QPaintEvent *)                                                                                    0x7ffff7c5763e 
20  QWidget::event(QEvent *)                                                                                                  0x7ffff7b134f8 

![https://i.stack.imgur.com/3VAaI.png][https://i.stack.imgur.com/3VAaI.png]

other find: use Qt5.14 and use Qt5.9 has diffent depands QT5.14.2

linux-vdso.so.1 (0x00007ffcdcda8000)
    libQt5Widgets.so.5 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libQt5Widgets.so.5 (0x00007f950c550000)
    libQt5Gui.so.5 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libQt5Gui.so.5 (0x00007f950bc36000)
    libQt5Core.so.5 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libQt5Core.so.5 (0x00007f950b45b000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f950b23c000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f950aeb3000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f950ab15000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f950a8fd000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f950a50c000)
    libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f950a280000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f950a063000)
    libicui18n.so.56 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libicui18n.so.56 (0x00007f9509bca000)
    libicuuc.so.56 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libicuuc.so.56 (0x00007f9509812000)
    libicudata.so.56 => /home/john/Qt5.14.2/5.14.2/gcc_64/lib/libicudata.so.56 (0x00007f9507e2f000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9507c2b000)
    libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f9507a29000)
    libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f9507712000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f950f3e6000)
    libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f95074e1000)
    libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f950722b000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9506fb9000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f9506c81000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f9506a59000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f9506855000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f950664f000)
    libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f950643a000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f9506232000)

QT5.9.8

linux-vdso.so.1 (0x00007ffc6ddf8000)
    libQt5Widgets.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007f95c72f2000)
    libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007f95c6b89000)
    libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f95c643e000)
    libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f95c61b2000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f95c5f93000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f95c5c0a000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f95c586c000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f95c5654000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f95c5263000)
    libpng16.so.16 => /usr/lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f95c5031000)
    libharfbuzz.so.0 => /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f95c4d93000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f95c4b76000)
    libicui18n.so.60 => /usr/lib/x86_64-linux-gnu/libicui18n.so.60 (0x00007f95c46d5000)
    libicuuc.so.60 => /usr/lib/x86_64-linux-gnu/libicuuc.so.60 (0x00007f95c431d000)
    libdouble-conversion.so.1 => /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.1 (0x00007f95c410c000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f95c3f08000)
    libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f95c3bf1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f95c7b39000)
    libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f95c39c0000)
    libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f95c370a000)
    libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f95c3456000)
    libgraphite2.so.3 => /usr/lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f95c3229000)
    libicudata.so.60 => /usr/lib/x86_64-linux-gnu/libicudata.so.60 (0x00007f95c1680000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f95c140e000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f95c10d6000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f95c0eae000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f95c0caa000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f95c0aa4000)
    libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f95c088f000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f95c0687000)

【问题讨论】:

  • 请提供一个小的工作示例,而不是场外代码的链接。
  • 想,变了。

标签: linux qt mupdf


【解决方案1】:

鉴于这部分堆栈跟踪:

hb_qt_face_get_for_engine(QFontEngine *)
QFontEngine::harfbuzzFace() const      

您可能会看到 mupdf 中包含的 harfbuzz 版本与 qt 正在使用的版本之间存在冲突。可能 API 发生了一些变化,qt 正在调用 mupdf 提供的版本,该版本的 API 与预期的不同。

有许多可能的解决方案。您可以将 mupdf(以及它的所有第三方依赖项,如 harfbuzz)构建到 .so 中,并确保 harfbuzz 符号在 .so 外部不可见,这意味着 qt 看不到 harfbuzz 的 mupdf 版本,因此将调用打算的一个。另一种解决方案是尝试针对 harfbuzz 的系统版本而不是 mupdf 中的系统版本构建 mupdf,但如果 API 已更改,则需要更改 mupdf 的代码。

【讨论】:

  • 感谢反馈,解决方案2:首先我通过`` sudo apt-get install libharfbuzz-dev ``` 安装libharfbuzz,更改使用harfbuzz 的mupdf cpp 文件,更改makefile 不构建mupdf harfbuzz,mupdf build静态库成功,再次使用新库和libharfbuzz构建Qt项目,出现新的分段错误..```
  • 1 ?? 0xfffff37c6d68 2 ?? 0xfffff37cb068 3 ?? 0xfffff37cc914 4 ?? 0xfffff37ce52c 5 QRasterPaintEngine::drawCachedGlyphs(int, unsigned int const *, QFixedPoint const *, QFontEngine *) 0xfffff761b594 6 QRasterPaintEngine::drawTextItem(QPointF const&, QTextItem const&)0xfffff761e698 7 ?? 0xfffff7633808 8 QTextLine::draw(QPainter *, QPointF const&, QTextLayout::FormatRange const *) const 0xfffff74ea584 9 ??
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
相关资源
最近更新 更多