QT中的除錯技術

2021-06-22 20:58:16 字數 2781 閱讀 8097

下面提供一些有用的提示來幫助你除錯基於qt開發的應用程式。

安裝配置qt時,要確保包含除錯選項。在一些平台上,在除錯模式下編譯qt將導致應用程式比預想的要大。

在編譯qt的時候,預設要編譯框架。在結果中,可以找到發行版和除錯版(如qtcore和qtcore_debug)。如果通過-no-framework引數來編譯qt,將為每個qt庫編譯動態庫(如libqtcore.4.dylib和libqtcore_debug.4.dylib)。

在連線時使用框架或者不使用,將發生什麼事情。目前,沒有找到令人信服的理由來確認此事。

使用框架

由於發行版和除錯版的庫在框架中,應用程式自然靠框架連線。然後在偵錯程式中執行,通過設定dyld_image_suffix來確定是執行發現版還是除錯版。預設執行發行版。如果設定了dyld_image_suffix=debug,就執行除錯版。

當通過除錯配置要求qmake生成makefile時,qmake將靠_debug版本的庫來連線,並為應用程式生成除錯標示符。然後出將在gdb模式下執行,和其他平台執行gdb一樣,程式設計師可以跟蹤到qt內部。

gcc生成的除錯符號將占用相當大的空間。然而,通過xcode 2.3正式版使用dwarf符號將占用數量更小的控制項。選擇-dwarf-2選項配置指令碼,在配置qt時可以啟用這個功能。

預設不支援,因為之前版本的xcode沒有和編譯器標示一起執行來實現這個功能。mac os x 10.5將預設設定dwarf-2符號。

dwarf-2符號包含相關原始碼,因此最後的除錯應用程式會比發行版編譯大一些。

-nograb:應用程式不能獨佔滑鼠或者鍵盤。在linux的gdb偵錯程式中,這個選項預設生效。

-dograb:忽略任何隱式或顯示配置-nograb。即使設定了-nograb,-dograb也強制生效。

-sync:在x同步模式執行應用程式。同步模式強制x伺服器首先不使用快取立即完成每個x客戶端的請求。這將使用程式更容易除錯和慢一點。這個選擇僅對x11版本的qt有效。

qt自帶4個向外寫警告和除錯文字的方法。可以把它們使用在如下目的:

如果包含標頭檔案,qdebug()可以當做輸出流來使用。例如:

qdebug() << "

widget

"<< widget << "

at position

"<< widget->pos();

在unix/x11 and mac os x平台,qt實現了將錯誤資訊輸出到stderr裝置。在windows中,如果是乙個控制台程式,這個資訊將傳送給控制台;否則就傳送給偵錯程式。你可以通過使用

qinstallmsghandler

()安裝乙個訊息管理者來接管那些函式。

如果設定了qt_fatal_warnings環境變數,列印完警告資訊後,qwarning就退出。這讓獲取向後跟蹤更方便了。

qdebug和qwarning都是除錯工具。它們都可以通過qt_no_debug_output和qt_no_warning_output取消除錯。

當程式表現得十分奇怪時,qobject::dumpobjecttree()和qobject::dumpobjectinfo()除錯方法將十分有用。可以使用物件名,也可以不用。

你可以通過qdebug()為你的類實現流操作符號。這個類實現的流是qdebug。在qdebug中你需要知道的方法是space()和nospace()。它們都返回乙個debug流;它們之間的區別是十分在每條記錄中插入乙個空格。如下是乙個描繪2d座標的類的例子:

qdebug operator

<

在creating custom qt types 文件中,用源物件系統整合自定義型別被掩蓋地更深。

標頭檔案qtglobal包含一些巨集定義和預定義。

3個重要的巨集定義:

q_assert(cond):cond是乙個布林表示式,如果cond是false,寫警告資訊:assert:'cond' in file xyz.cpp,line 234,並退出。

q_assert_x(cond, where, what):cond是乙個布林表示式,where是位置,what是訊息,如果cond是false,寫警告資訊:assert failure in where: 'what', file xyz.cpp, line 234,並退出。

q_check_ptr(ptr):ptr是乙個指標。如果ptr是0,就寫警告資訊:in file xyz.cpp, line 234: out of memory,並退出。

這些巨集對診斷程式錯誤非常有用。例如:

char *alloc(int

size)

如果編譯過程中定義了qt_no_debug,q_assert(), q_assert_x(), and q_check_ptr()將什麼也沒有。基於這個原因,巨集的引數不應該帶有副加功能。下面是乙個使用q_check_ptr不正確的例子:

char *alloc(int

size)

如果這段**通過定義qt_no_debug來編譯,q_check_ptr中的表示式將不被執行,alloc將返回乙個未初始化的指標。

qt庫包含成百個錯誤檢查。當程式錯誤發生時,它將被列印出來。因此,我們建議你在開發基於qt的軟體時,使用qt的除錯版本。

有個常見的錯誤需要在這裡提到的是:如果在類定義中包含q_object巨集和執行源物件編譯器(moc),但是忘記將moc生成的源**連線到你要執行的物件**中,你將得到混亂不堪的錯誤訊息。任何與vtbl, _vtbl, __vtbl或者相關的錯誤都是由這個問題導致的。

參考:1. debugging techniques

2. 輕鬆實現qt日誌輸出到檔案 

3.除錯技術

Qt程式設計之除錯技術

17 除錯技術 qt應用程式的除錯可以通過ddd進行跟蹤除錯和列印各種除錯或警告資訊。ddd data display debugger 是使用gdb除錯工具的圖形工具,它安裝在linux作業系統中,使用方法可參考ddd的幫助文件。下面說明如何列印各種除錯或警告資訊 17.1 命令列引數 當你執行q...

QT核心程式設計之除錯技術 (7)

qt應用程式的除錯可以通過ddd進行跟蹤除錯和列印各種除錯或警告資訊。ddd data display debugger 是使用gdb除錯工具的圖形工具,它安裝在linux作業系統中,使用方法可參考ddd的幫助文件。下面說明如何列印各種除錯或警告資訊 1 命令列引數 當你執行q應用程式時,你可以指定...

qt中的隱含共享技術

在qt中,有一項隱含共享技術 也叫回寫複製,copy on write 它結合了淺拷貝和深拷貝的特點,具有以下優點 1 可以降低對記憶體和cpu資源的使用,提高程式的執行效率 2 方便程式設計師做某些物件的賦值操作,而不必拷貝深拷貝和淺拷貝的問題 隱含共享的工作原理,簡單說就是 當兩個物件共享同乙份...