2017-08-17 821 views
0

我試圖找出我的Qt應用程序崩潰的原因,調試不包含很多信息,因此很難找到原因。在使用斷點後,我發現最接近崩潰的線路可能是w.show()調用(應用程序的GUI在任何按鈕或任何按鈕出現之前都會凍結)。我的主要功能是正是這一點:Qt應用程序在啓動時崩潰在MainWindow.Show()調用

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 

    // disable Window's maxminize button 
    const Qt::WindowFlags flags = w.windowFlags()^Qt::WindowMaximizeButtonHint; 
    w.setWindowFlags(flags); 
    w.show(); 
    return a.exec(); 
} 

達到所在行w.show()時,在應用程序啓動(但不正常,GUI frooze,正如我前面提到的),並在幾分鐘後,我得到了一個段錯誤和調試器是這樣的:

enter image description here

我該如何解決這個問題?我在這已經有幾天了,試圖讓調試器提供更多的信息,以便我可以追溯到SEGFAULT的原因,但沒有這樣的調試器信息,我不知道該怎麼做。

我的Qt版本:

enter image description here

回答

0

實測溶液:

// disable Window's maximize button (use bitwise [and-not]&~ and not [xor]^) 
const Qt::WindowFlags flags = w.windowFlags() &~ Qt::WindowMaximizeButtonHint; 
w.setWindowFlags(flags); 

,或者相同的效果可以通過以下方式實現!

希望它與同樣的問題有用的人:

在調試消息我發現了墜毀是由GBIEH.dll DLL的結果。谷歌搜索它,我發現它與網上銀行有關(我想當我的應用程序試圖使用該DLL的IB應用程序將此作爲一種攻擊,因此崩潰,我的猜測)。我剛剛刪除了網上銀行的程序和應用程序工作正常。

0

有解決這樣的問題的各種方式,假設你不能提供一個MCVE:由一個

  • 地帶的主窗口一個元素,首先從構造函數中,看看造成崩潰的原因
  • 如果從構造函數中剝離元素有幫助,然後恢復它的一部分,然後運行調試器到stu dy導致凍結的原因
  • 請記住,凍結GUI程序通常意味着事件循環被阻止。如果您在任何地方撥打QApplication::processEvents(),請考慮刪除它。最後,如果一切都失敗了,你將不得不去linux系統,並在調試模式下重新編譯Qt(debug + release從來沒有爲我工作過),跟蹤事件循環並在代碼中看到什麼會凍結你的GUI。

我推薦Linux的原因是因爲gdb很棒,而cdb在這方面很糟糕。如果你有VS企業,你也可以嘗試它的調試器。

祝你好運。

+0

我已經通過在構造函數的每一行中放置一個斷點來嘗試#1,它已到達構造函數的罰款結束。所以錯誤不存在。 #2:與#1相同。 #3我不會在應用程序啓動時調用它。所以我想它也不會。 #4感謝提示,如果我花更多時間在這個上,我會嘗試在Linux上。 #5:我現在試着連接到vs調試器。再次感謝! – Jack

0

的原代碼的部分,其具有一個問題(固定):

w.setWindowFlag(Qt::WindowMaximizeButtonHint, false); 
+0

感謝您的修復。但'w.setWindowFlag()'沒有發現錯誤。你正在使用哪個Qt版本? – Jack

+0

我在Mac和Linux上使用Qt 5.7和5.9(可能與您的問題無關)。這條線是不正確的,沒有給你你想要的東西。我無法知道你係統中的某個地方的GBIEH.dll。多年來,在Windows上執行Qt應用程序永遠不會運行,代碼很簡單,只有一個明顯的錯誤(儘管不會導致崩潰)。 – AlexanderVX