在配置为在Windows 7 x64下使用MinGW(来自32位QT分发版)的QT 5.4.2项目中,我发现程序工作正常通常情况下,但在GDB崩溃。我已经追溯到从QML传递给我的回调函数的无效参数。它是一个在用作上下文属性的对象上定义的函数。该函数接收QString作为其参数。在没有gdb的情况下执行时,其值如预期。对于gdb,它包含垃圾(不是随机的垃圾,但每次都是相同的垃圾)。示例代码:Windows上的QT:从GDB运行时函数参数无效
class CallbackSink : public QObject {
Q_OBJECT
public:
CallbackSink() {}
Q_INVOKABLE virtual QString callTestString2(const QString &str) { return QString(""); }
virtual ~CallbackSink() {}
};
class Sink : public CallbackSink {
Q_OBJECT
public:
Sink() {}
Q_INVOKABLE virtual QString callTestString2(const QString &str) {
const char *_str = str.toUtf8().constData();
printf("_str=%s\n", _str);
const char *_ret = "fdsa";
QString ret = QString::fromUtf8(_ret);
return ret;
}
virtual ~Sink() {}
};
QT初始化代码:
gui.h:
struct Gui {
public:
std::unique_ptr<QApplication> app;
std::unique_ptr<QQmlApplicationEngine> engine;
std::unique_ptr<CallbackSink> sink;
QQuickWindow *window;
Gui(std::unique_ptr<CallbackSink> s) : sink(std::move(s)) {}
int run();
virtual ~Gui() {}
};
gui.cpp:
int Gui::run() {
char x[] = "BLAH BLAH";
char *argv = x;
int argc = 1;
app = std::unique_ptr<QApplication>(new QApplication(argc,&argv));
engine = std::unique_ptr<QQmlApplicationEngine>(new QQmlApplicationEngine());
QQmlContext *objectContext = engine->rootContext();
objectContext->setContextProperty("callbacks", &*sink);
engine->load(QUrl("qrc:///myqml.qml"));
QObject *topLevel = engine->rootObjects().value(0);
window = qobject_cast<QQuickWindow *>(topLevel);
window->show();
int r = app->exec();
return r;
}
及相关QML片段:
Text {
id: mytext
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
textFormat: Text.RichText
text: '<p>call 2: `' + callbacks.callTestString2('foo') + '`'
}
我想值得注意的是,我将所有的GUI代码编译为一个DLL,并且可执行文件从一个单独的项目链接到它。
当从gdb下运行,我认为这是印刷(同无关的参数值的东西):
_str=ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■ю■☺!=4/Ц♠↑☺
UPDATE:还试图使用Qt 5.5,同样的问题。
UPDATE 2:我从QtCreator中的模板创建了一个新的QtQuick应用程序项目,并对其进行了最小的更改以重现此问题。它也发生在这个项目中。
太棒了!非常感谢! – kirillkh