【发布时间】:2014-05-14 12:02:16
【问题描述】:
我正在测试这个库,但每当它到达某一行时我就会遇到分段错误(下面的注释行)。这个问题来自this question - 在一个更大的项目中遇到同样的问题,所以我决定单独测试这些库,显然这就是失败的原因。此代码适用于使用 Qt4 的同事的 32 位机器(他将代码交给了我)。我将它迁移到 Qt5 并使用 32 位编译器编译,但我遇到了分段错误。如果我评论有问题的行和它下面的两个,程序就会运行(尽管它只是一个空窗口)。
会发生什么?
#include "qenctest.h"
#include <QLibrary>
#include <QtWidgets/QMessageBox>
typedef void (*encRefresh)(QPainter*);
encRefresh enc_refresh = NULL;
typedef void (*encResize)(QSize);
encResize enc_resize = NULL;
typedef QENCSignaler* (*encInit)(QString);
typedef void (*encOpenFile)(QString);
QENCTest::QENCTest(QWidget *parent, Qt::WindowFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
QLibrary _qenc("qenc");
encInit enc_init;
encOpenFile enc_openFile;
enc_init = (encInit) _qenc.resolve("init"); // I checked and it does load the library and the symbol succesfully
enc_openFile = (encOpenFile) _qenc.resolve("openFile");
enc_resize = (encResize) _qenc.resolve("resize");
enc_refresh = (encRefresh) _qenc.resolve("refresh");
QString path = "encfg";
QENCSignaler* qencSignaler = enc_init(path); // Throws segfault here
connect(qencSignaler, SIGNAL(newChart(Chart*)), this, SLOT(qencNewChart(Chart*)));
connect(qencSignaler, SIGNAL(startReadChart(char*)), this, SLOT(qencStartReadChart(char*)));
enc_openFile("PL2BAPOL.000");
int _s = 0;
}
调试信息:
PS: 一些本地人和表达式是红色的是什么意思?
编辑
好的,我必须对库代码进行的唯一主要更改是:
AttributeSet::iterator vItPOI = attributes.at(i).find("POI");
if (vItPOI == attributes.at(i).end()) continue;
AttributeSet::iterator vItPOI0 = attributes.at(i).find("POI0");
if (vItPOI0 == attributes.at(i).end()) continue;
if (vItPOI -> getStringValue() == "Bankowoæ" &&
selectedPOI & POI_BANKING) {
if (vItPOI0 -> getStringValue() == "Placówka banku") {
drawSymbol(painter, x, y, POI_BANKING);
}
}
对此(还有更多的ifs,但这很好地说明了它)
ShapeAttribute vItPOI = attributes.at(i).find("POI").value();
if (attributes.at(i).find("POI") == attributes.at(i).end()) continue;
ShapeAttribute vItPOI0 = attributes.at(i).find("POI0").value();
if (attributes.at(i).find("POI0") == attributes.at(i).end()) continue;
if (vItPOI . getStringValue() == "Bankowo��" &&
selectedPOI & POI_BANKING) {
if (vItPOI0 . getStringValue() == "Plac�wka banku") {
drawSymbol(painter, x, y, POI_BANKING);
}
}
理论上应该是一样的吧?尽管我确实觉得奇怪的是,在第一个 sn-p 中它使用 -> 而不是 .当它不是指针时。我不得不将其更改为,因为我收到了这些错误:
^
..\qenc\ShapeLandPOI.cpp: In member function 'virtual void ShapeLandPOI::draw(QPainter*)':
..\qenc\ShapeLandPOI.cpp:74:62: error: conversion from 'QMap<QString, ShapeAttribute>::const_iterator' to non-scalar type 'QMap<QString, ShapeAttribute>::iterator' requested
AttributeSet::iterator vItPOI = attributes.at(i).find("POI");
^
..\qenc\ShapeLandPOI.cpp:76:64: error: conversion from 'QMap<QString, ShapeAttribute>::const_iterator' to non-scalar type 'QMap<QString, ShapeAttribute>::iterator' requested
AttributeSet::iterator vItPOI0 = attributes.at(i).find("POI0");
^
【问题讨论】:
-
你可以进入库代码吗?
-
@ratchetfreak 不,先生,如果我尝试这样做,我会得到反汇编代码,我能得到的最远是上面显示的第 4 级
-
反汇编代码很好,这意味着它是负责错误的库而不是您的加载代码
-
@ratchetfreak 问题是我从库中获得了代码并将其从 Qt4 迁移到 Qt5,我在发布模式下构建它并使用与此应用程序相同的编译器。也许我应该小心地再次迁移它?
-
您可能应该重建库的调试版本,并尝试调试它,因为故障似乎在那里。它可能包含一些似乎适用于 Qt4 但不再适用的未定义行为。
标签: c++ qt dll segmentation-fault migration