Qt入门(10)——调试技术
生活随笔
收集整理的這篇文章主要介紹了
Qt入门(10)——调试技术
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
命令行參數
當你運行Qt程序時,你可以指定幾個命令行參數來幫助你調試。
-nograb 應用程序不再捕獲鼠標或者鍵盤。當程序在Linux下運行在gdb調試器中時這個選項是默認的。
-dograb 忽略任何隱含的或明顯得-nograb。即使-nograb出現在命令行的最后,-dograb也會超過-nograb生效的。
-sync 在X同步模式下運行應用程序。同步模式強迫X服務器立即執行每一個X客戶端的請求,而并不能使用緩存優化。它使得程序更加容易測試并且通常會更慢。-sync模式只對X11版本的Qt有效。
警告和調試消息
Qt包含了三個全局函數來寫出警告和調試文本。
qDebug()用來為測試及其它寫調試輸出。
qWarning()用來在程序發生錯誤時寫警告輸出。
qFatal()用來寫致命錯誤消息并且退出。
這些函數的Qt實現是在Unix/X11下把文本打印到標準錯誤(stderr)輸出,在Windows下會打印到調試器。你可以通過安裝一個消息處理器,qInstallMsgHandler()來接收這些函數。
當應用程序看起來或者用起來很奇怪的時候,調試函數QObject::dumpObjectTree()和QObject::dumpObjectInfo()很有用。如果你使用了對象名稱,這將會更有用,但通常情況下是沒有名稱的。
調試宏
qglobal.h頭文件包含了很多調試宏和#defines。
兩個重要的宏是:
Q_ASSERT(b)里面的b是一個布爾表達式,當b是FALSE的時候,寫出警告信息:“ASSERT: 'b' in file file.cpp (234)”。
Q_CHECK_PTR(p)里面的p是一個指針。如果p是空的話,寫出警告信息:“In file file.cpp, line 234: Out of memory”。
這些宏在檢測程序錯誤時很有用,比如像這樣:
char *alloc( int size ){Q_ASSERT( size > 0 );char *p = new char[size];Q_CHECK_PTR( p );return p;}
如果你定義了QT_FATAL_ASSERT標記,Q_ASSERT將會調用fatal()而不是warning(),所以一個錯誤聲明將會導致在打印錯誤消息后使程序退出。
注意如果QT_CHECK_STATE未定義,Q_ASSERT宏就是一個空的表達式(參見下面)。在里面的任何代碼都不會被執行。相似的,如果QT_CHECK_NULL未定義,Q_CHECK_PTR也是一個空的表達式。這里就是一個不應該如此使用Q_ASSERT和Q_CHECK_PTR的例子:
char *alloc( int size ){char *p;Q_CHECK_PTR( p = new char[size] ); // WRONGreturn p;}
這個問題是棘手的:僅僅在正確的檢測標記被定義時,p才會被設置為健全的值。如果QT_CHECK_NULL標記沒有被定義,代碼被編譯了,在Q_CHECK_PTR表達式中的代碼是不會被執行的(正確地,因為它僅僅用于調試目的)并且會分配一個瘋狂的指針。
Qt庫包含了幾百個內部檢查,當一些錯誤被檢測出時,會打印警告信息。
Qt中的健全測試和作為結果的警告信息是有條件的,基于不同的調試標記的狀態:
QT_CHECK_STATE:檢測一致的/期望的對象狀態
QT_CHECK_RANGE:檢測變量范圍錯誤
QT_CHECK_NULL:檢測危險的空指針
QT_CHECK_MATH:檢測危險的數學,比如被0除
QT_NO_CHECK:關閉所有的QT_CHECK_...標記
QT_DEBUG:使調試代碼生效
QT_NO_DEBUG:關閉QT_DEBUG標記
默認情況下,QT_DEBUG和所有的QT_CHECK標記都是打開的。如果要關閉QT_DEBUG,請定義QT_NO_DEBUG。如果要關閉QT_CHECK標記,請定義QT_NO_CHECK。
實例:
void f( char *p, int i ){#if defined(QT_CHECK_NULL)if ( p == 0 )qWarning( "f: Null pointer not allowed" );#endif#if defined(QT_CHECK_RANGE)if ( i < 0 )qWarning( "f: The index cannot be negative" );#endif}
普通的Bug
這是一個如此普通的bug,所以要在這里提到:如果你你在類生命中包含了Q_OBJECT宏并且運行了moc,但是忘記了把moc生成的對象代碼連接到你的可執行程序中,你就會得到非常困惑的錯誤消息。
任何一個會提示缺乏vtbl、_vtbl、__vtbl或者和這個類似的連接錯誤都有可能是這樣的問題。
轉載于:https://www.cnblogs.com/niulanshan/p/6174679.html
總結
以上是生活随笔為你收集整理的Qt入门(10)——调试技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计组之数据运算:12、加法器设计
- 下一篇: (计算机组成原理)第一章计算机系统概述-