2012-05-09 57 views
3

是否有任何簡單的方法來編寫腳本或某種類型的代碼來使用它們來觀看GDB中的複雜對象?我能想到的一件事就是在代碼中有特殊的功能,並通過call debugViewer(object)直接調用它們。有沒有更好的方法來做到這一點?如何觀看gdb中的複雜對象?

你會如何以不同的方式使用可視化調試器,如Qt Creator中的調試器?

+0

這可能有助於[鏈接](http://stackoverflow.com/questions/10169974/cant - 請參閱-一些對象,內部功能於QT-創本地人和表達式調試-W) –

回答

3

我使用GDB的DDD圖形界面,它專門設計用於顯示您可能稱爲「複雜對象」的內容。然而,儘管如此,我發現在除了普通的類/結構之外的任何其他代碼中編寫dbg()方法通常會更好,其優點是dbg()方法不僅可以將對象的內容打印到stdout,還可以進行自定義對象完整性檢查,包括驗證擁有/連接的對象是否處於預期狀態等等,並且它可以隱藏它知道有效但通常對調試無用的信息,除非您將「詳細」標誌傳遞給它(或者具有冗餘的單獨功能)。爲了更容易從GDB命令行調用該方法,我已經編寫了非成員方法,它可以根據您在文章中提出的建議採用指向目標對象的dbg()方法的指針。

此外,關於完整性檢查,並沒有真正涉及到你的問題,我發現幾乎任何時候有人試圖複製功能類似於std :: string,std :: list或std :: map或任何(通常是出於「性能原因」),它們總會出錯,通常是除了難以測試的多毛邊緣情況外沒有出現的東西。現在我已經三次發現了在這種實現中存在多重毛邊邊界的情況,這是通過編寫一個數據結構完整性測試者的數據結構類的朋友類來完成的,其工作是簡單地抓取整個數據結構(列表或樹或任何)一直到末尾,尋找陳舊/損壞的指針(即在一個列表中,任何'next-> prev'不等於'this'或'prev-> next'不等於'this',等等) 。其中一個數據結構是一個入侵式組合列表圖(帶有嵌入式DAG的列表),這對解決疑難問題非常有趣。在單獨列表之間進行了多次拼接/傳輸操作之後,存在很多機會鏈接&在一個列表中引用DAG,引用另一個列表中的節點。令人驚訝的是,在我寫完整性檢查器並發現毛邊邊框錯誤之前,該結構在內部使用了近一年時間。

對不起,我猜這不是你的問題所在,但是無論如何都很有趣。

0

您可以嘗試使用 「洞察」,這是在本作GDB看一個漂亮的GUI:

GDB GUI Insight