2012-12-07 79 views
-1

我是gdb的新手。我想在c程序的執行過程中打印與實際序列一起使用的內存地址。我們用一個例子來解釋我的問題。假設我們有以下兩個函數main()和test()。我知道,在gdb裏面,我可以使用「反彙編main」來反彙編main()函數,或者「反彙編測試」來分別反彙編test()函數。我的問題是,如何將這兩個函數作爲單個代碼進行反彙編;因此,我可以看到執行期間使用的所有內存地址及其訪問順序?具體來說,main()調用test()並且test()也會多次調用自己,所以我希望看到類似於示例2的內容。我也在漫遊,gdb反彙編中顯示的地址是虛擬還是物理內存地址?任何幫助或指導將不勝感激。在GDB中打印內存訪問

例1:

#include "stdio.h" 

int test(int q) 
{ 
    if(q<16) 
    test(q+5); 

    return q; 
} 

void main() 
{ 
    unsigned int a=5; 
    unsigned int b=5; 
    unsigned int c=5; 

    test(a); 
} 

例2:

<Memory Address> <assembly instruction> <c instructions> 

0x12546a mov //for unsigned int a=5; 
0x12546b mov //for unsigned int b=5; 
0x12546c mov //for unsigned int c=5;  
0x12546d jmp //for test(q=a=5); 
0x12546e cmpl //for if(q<16) 
0x12546f jmp //for test(q+5); 
0x12546d jmp //for test(q=10); 
0x12546e cmpl //for if(q<16) 
0x12546f jmp //for test(q+5); 
0x12547a jmp //for test(q=15); 
0x12547b cmpl //for if(q<16) 
0x12547c jmp //for test(q+5); 
0x12547d jmp //for test(q=20); 
0x12547e cmpl //for if(q<16) 
0x12547f jmp //return q); 
0x12548a jmp //return q); 
0x12548b jmp //return q); 
0x12548c jmp //return q); 

回答

0

有真的做到這一點沒有漂亮的方式。你只是將不得不步執行代碼:

(gdb) stepi 
(gdb) x/i $pc 
(gdb) info registers 
(gdb) stepi 
(gdb) x/i $pc 
(gdb) info registers 
..... 

你可以腳本,以便它迅速做它和數據轉儲到一個文件中,但是這就是全部。

0

我想你可能會有更多的運氣與valgrind。如果沒有現成的工具可以這樣做,可以添加自己的工具來報告內存訪問(而不僅僅是這些),或者修改現有的工具。

E.g.見http://valgrind.org/docs/manual/lk-manual.html

--trace-MEM = [默認:無]

當啓用時,拉基打印的由程序進行幾乎每一個存儲器存取的大小和地址。