2010-09-22 106 views
3

我調試在基於GObject的應用程序的引用泄漏。 GObject的有一個簡單的內置的機制,以幫助這些事情:你可以在gobject.c設置g_trap_object_ref變量,你關心的對象,則該對象的每個ref或UNREF將達到一個斷點指令(通過G_BREAKPOINT()) 。我可以指示gdb運行命令來響應SIGTRAP嗎?

所以果然,程序沒有得到停止,用gdb報告:

Program received signal SIGTRAP, Trace/breakpoint trap. 
g_object_ref (_object=0x65f090) at gobject.c:2606 
2606  old_val = g_atomic_int_exchange_and_add ((int *)&object->ref_count, 1); 
(gdb) _ 

這是一個很好的開始。現在,一般情況下我一些腳本命令在斷點處手動設置使用commands 3來運行(斷點3,說了)。但是,等效SIGTRAP,即handle SIGTRAP,不給我做什麼特別有趣的選項。有沒有一個好的方法來做到這一點?

(我知道,還有其他的方法來調試參考泄漏,如g_object_ref()g_object_unref()在對象的ref_count場,refdbg,腳本定期斷點設置觀察點,我現在就要去那些嘗試。我正在尋找一種方法來編寫對SIGTRAP的響應腳本,它可能會在其他情況下有用,如果gdb不支持此功能,我會很驚訝。)

回答

3

GDB不支持它。

一般來說,附加命令腳本信號變得毫無意義 - 你的程序可以在任何數量的場所接受SIGTRAP,和該命令將不知道特定SIGTRAP是否排在預期範圍內或沒有。

+0

令人痛心的,但我想並非完全出乎意料。 – wjt 2010-09-24 16:44:38

4

你想表現出一定的值,並繼續執行程序?在這種情況下,只要定義顯示你所感興趣的值,繼續執行和遞歸調用自身的宏:

define c 
echo do stuff\n 
continue 
c 
end 
+0

哦,這是一個整潔的kludge! – wjt 2010-09-24 21:45:21

相關問題