2013-07-16 17 views
4

我正在做一個崩潰程序的事後分析。我在Linux(Ubuntu 12.04,x86)上,代碼是用C++編寫的。該計劃正在使用一些可能包含有價值信息的單身人士。是否有可能找到指向一個單身的情況下,如果它是這樣產生:在GDB(C++)中查找指向單例死亡事件的指針

SingletonType& SingletonType::getInstance(){ 
    static SingletonType* instance = new SingletonType(); 
    return *instance; 
} 

,如果它是可能的,它是如何在GDB做了什麼?

+0

'p/X和辛格爾頓::型的getInstance()'? –

+0

不幸的是,不幸的是,你不能這樣做,沒有一個正在運行的過程。 – techshack

回答

3

運行GDB與核心文件,並運行命令

disassemble SingletonType::getInstance 

在我的測試程序,我發現附近的方法的最後一個mov 0x<addr>, %eax指令。 A print *(*(SingletonType**) <0xaddr>)應該打印您的單身結構的內容。

+1

我不知道爲什麼你不直接''解散SingletonType :: getInstance'?首先,根據基地址,「反彙編」可能甚至不會做正確的事情。 – sehe

+0

你說得對。給定的程序給了我我想要的,但它是完全可以通過使用函數的名稱進行反彙編,它也更優雅:) – techshack

+0

好點sehe。我刪除了objdump部分,並在我的答案中更新了dissassemble命令。 – tfk

3

show modules 也許應該告訴你的基址,並instance,是靜態分配的,應當在某種objdump/nm報告可見。是毛茸茸的數學。

另一種方法是拆卸SingletonType::getInstance(),看看有什麼有效的地址在初始化/返回路徑被加載。


嗯找不到我想起了精確匹配。 info sharedlibrary會給你最多的信息。

0

這是我做的,而用gdb內線核心:

(gdb) info var instance 

這將列出所有的單身實例,其中你會發現SingletonType

的一個
0x86aa960 SingletonType::getInstance()::instance 
的所有地址

現在,我有你的地址可以打印您的實例」指出內存:

(gdb) p *((SingletonType*)0x86aa960)