2015-07-03 62 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

相關問題