我使用Qt5.9,一個簡單的檢查:Qt SIGABRT替代消息?
assert(pobjNode != NULL);
將導致顯示Qt的信號接收錯誤對話框,它沒有給出任何關於問題出在哪裏或什麼是任何有用的信息。
有沒有辦法用一些更有用的東西來替代這些無用的信息?
我在想的是一種設置對話框的方法,以顯示出現錯誤時可能出現的錯誤。
我使用Qt5.9,一個簡單的檢查:Qt SIGABRT替代消息?
assert(pobjNode != NULL);
將導致顯示Qt的信號接收錯誤對話框,它沒有給出任何關於問題出在哪裏或什麼是任何有用的信息。
有沒有辦法用一些更有用的東西來替代這些無用的信息?
我在想的是一種設置對話框的方法,以顯示出現錯誤時可能出現的錯誤。
Q_ASSERT
是一個自定義斷言宏,它可以增強標準的assert
函數。
該錯誤消息由qFatal()
處理,它在某些平臺上的行爲可能會比標準斷言宏好一些。例如,在Windows上,它將在斷言失敗的位置觸發Visual Studio調試器,而不是僅調用abort()
。
您還可以重定向 Qt錯誤消息的輸出功能,如qFatal
到您的自定義消息處理程序(與qInstallMessageHandler())。例如,如果您想將錯誤消息重定向到一個文件,它會很有用。
還要注意的是Q_ASSERT
是禁用宏QT_NO_DEBUG
(而assert
由NDEBUG
禁用):這可以用來分隔您的斷言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。
您可能會定義自己的MY_ASSERT
宏。在Linux上,它甚至可以調用另一個函數,它使用Glibc backtrace functions或Ian Taylor的libbacktrace庫(假設您的代碼使用g++ -g
編譯爲DWARF調試信息),並可能在模態對話框或stderr中顯示此類信息。但是,它可能不應該返回。另請閱讀有關Qt and Unix signals和signal-safety(7)。
但是assert
檢測到您應該更正的錯誤。儘量避免使用此類程序員錯誤運送代碼。
在Linux上,通常assert
- 它是/usr/include/assert.h
中定義的宏 - 將調用失敗__assert_fail
(在你的C庫,但你可能會自己重新定義),這將間接調用abort
這間接使得core dump,你可以使用gdb
調試器檢查驗屍。您只需啓用核心轉儲(在您的bash終端中使用內建的ulimit -c
)。
Starynkevich聽起來不錯,發佈+1,可以在Linux中有用 – saeed
在哪個操作系統上?爲什麼使用'gdb'調試器是不夠的? –
Ubuntu,我不想使用調試器來處理所有事情......它更容易拋出斷言並運行應用程序。 – SPlatten