2015-07-03 19 views
0

在配置为在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应用程序项目,并对其进行了最小的更改以重现此问题。它也发生在这个项目中。

回答

2
const char *_str = str.toUtf8().constData(); 
printf("_str=%s\n", _str); 

您在此处有未定义的行为。 toUtf8()返回一个临时对象,它将在完整表达式的末尾被销毁。 constData()返回一个指针,该指针在该临时对象被销毁后不能保证有效。试试这个:

printf("_str=%s\n", qPrintable(_str)); 
+0

太棒了!非常感谢! – kirillkh

相关问题