2017-10-19 87 views
1

我使用Qt5.9,一個簡單的檢查:Qt SIGABRT替代消息?

 assert(pobjNode != NULL); 

將導致顯示Qt的信號接收錯誤對話框,它沒有給出任何關於問題出在哪裏或什麼是任何有用的信息。

有沒有辦法用一些更有用的東西來替代這些無用的信息?

我在想的是一種設置對話框的方法,以顯示出現錯誤時可能出現的錯誤。

+0

在哪個操作系統上?爲什麼使用'gdb'調試器是不夠的? –

+0

Ubuntu,我不想使用調試器來處理所有事情......它更容易拋出斷言並運行應用程序。 – SPlatten

回答

1

Q_ASSERT是一個自定義斷言宏,它可以增強標準的assert函數。

該錯誤消息由qFatal()處理,它在某些平臺上的行爲可能會比標準斷言宏好一些。例如,在Windows上,它將在斷言失敗的位置觸發Visual Studio調試器,而不是僅調用abort()

您還可以重定向 Qt錯誤消息的輸出功能,如qFatal到您的自定義消息處理程序(與qInstallMessageHandler())。例如,如果您想將錯誤消息重定向到一個文件,它會很有用。

還要注意的是Q_ASSERT是禁用宏QT_NO_DEBUG(而assertNDEBUG禁用):這可以用來分隔您的斷言Qt的相關代碼和休息之間。

Q_ASSERT_X打印信息與位置一起,源文件名和行號如果測試是錯誤的。 打印郵件的內容以及測試的源文件名和行號是否爲false的位置。 實施例:

// File: div.cpp 
    #include <QtGlobal> 
    int divide(int a, int b) 
     { 
      Q_ASSERT_X(b != 0, "divide", "division by zero"); 
      return a/b; 
     } 

閱讀有關test and debug

+0

在帖子的底部有一個關於Qt文檔測試和調試的鏈接,您可以閱讀它並找到很好的解決方法。任何方式,如果你想有更多的信息,請讓我知道 – saeed

+0

hmmm ....剛剛通過了所有的代碼,並用Q_ASSERT_X替換了斷言的實例,對話框中顯示的錯誤沒有改變,仍然像以前一樣無用。 ...「信號接收,劣勢因爲它從操作系統收到信號而停止。」 – SPlatten

+1

如果你正在使用qt creator和gdb goto Tools-> options-> debugger在Gdb中擴展選項卡標記停止當調用qFatal()時 – saeed

1

您可能會定義自己的MY_ASSERT宏。在Linux上,它甚至可以調用另一個函數,它使用Glibc backtrace functions或Ian Taylor的libbacktrace庫(假設您的代碼使用g++ -g編譯爲DWARF調試信息),並可能在模態對話框或stderr中顯示此類信息。但是,它可能不應該返回。另請閱讀有關Qt and Unix signalssignal-safety(7)

但是assert檢測到您應該更正的錯誤。儘量避免使用此類程序員錯誤運送代碼。

在Linux上,通常assert - 它是/usr/include/assert.h中定義的宏 - 將調用失敗__assert_fail(在你的C庫,但你可能會自己重新定義),這將間接調用abort這間接使得core dump,你可以使用gdb調試器檢查驗屍。您只需啓用核心轉儲(在您的bash終端中使用內建的ulimit -c)。

+0

Starynkevich聽起來不錯,發佈+1,可以在Linux中有用 – saeed