2013-12-20 116 views
0

我想了解如何打印一個整數值(我看到它是x/d)但我錯過了一些東西。gdb調試整數打印信息

所以,我的代碼如下

1 #include <stdio.h> 
2 main(){ 
3 int a; 
4 int b; 
5 int c; 
6 int d; 
7 int multiplied; 
8 a = 5; 
9 b = 6; 
10 c = 7; 
11 d = adding(a,b,c); 
12 multiplied = multiply(a,b,c); 
13 printf("The value of d is %d \n",d); 
14 printf("The multiplied values are %d \n", multiplied); 
15 } 
16 int adding(a,b,c){ 
17 int e; 
18 e = a+b+c; 
19 return e; 
20 } 
21 int multiply(a,b,c){ 
22 int f = a*b*c; 
23 return f; 
24 } 

//我-q編譯,我想打印變量的值(從它們的地址),所以......

(gdb) disassemble main 
0x080483ed <+9>: mov DWORD PTR [esp+0x2c],0x5 
0x080483f5 <+17>: mov DWORD PTR [esp+0x28],0x6 
0x080483fd <+25>: mov DWORD PTR [esp+0x24],0x7 
0x08048405 <+33>: mov eax,DWORD PTR [esp+0x24] <code> 

我在main/multiply /添加了一些斷點,然後我試着做下面的事情。

我用 print $esp+0x24(gdb) x/4d 0xbffff47c但IM沒有得到正確的答案回來。

我用4d因爲我認爲一個整數是4個字節(或者可能再次缺少一些東西),但結果arent沒有顯示值5. 你能幫我嗎?感謝和廣發行的不良輸出/格式抱歉..認真我無法理解什麼是錯

(gdb) print $esp+0x2c 
$2 = (void *) 0xbffff494 
(gdb) print $esp+0x28 
$3 = (void *) 0xbffff490 
(gdb) print $esp+0x24 
$4 = (void *) 0xbffff48c 
(gdb) x/d 0xbffff494 
0xbffff494: -1208180748 
(gdb) x/d 0xbffff490 
0xbffff490: -1208179932 
(gdb) x/d 0xbffff48c 
0xbffff48c: 134513881 

這也主要在第一個斷點後ofcourse發生,實際上是相同的價值觀來了所有的時間,所有的斷點(除了主要之前...)

另一個有趣的事情,我發現是以下...我確定第一個值是垃圾。但是爲什麼當它應該打印實際值時,它認爲0x5是一個地址?

Breakpoint 1, main() at functioncalling.c:10 
10 a = 5; 
(gdb) x/s a 
0xb7fc9ff4: "|M\025" 
(gdb) cont 
Continuing. 
Breakpoint 3, adding (a=5, b=6, c=7) at functioncalling.c:21 
21 e = a+b+c; 
(gdb) x/s a 
0x5: <Address 0x5 out of bounds> 
+0

「我用'print $ esp + 0x24'」 - 在程序中的哪一點?你真的應該顯示你使用的實際命令和他們的輸出。沒有這些信息,你的問題就無法得到解答。 –

回答

1

我編譯你的程序與-g和沒有優化,以及線11之前設置一個斷點我的堆棧地址有一點你們的不同,給出的各種系統在那裏,這並不奇怪。

(gdb) print $esp+0x2c 
$2 = (void *) 0xbffff44c 

這是打印地址a。爲了證實:

(gdb) print &a 
$4 = (int *) 0xbffff44c 

使用x/wd顯示十進制4字節整數。

(gdb) x/wd $esp+0x2c 
0xbffff44c: 5 

x/4d將顯示4個值(4是重複計數)起始於地址。如果您在此忽略大小字母w,則x命令將默認爲先前使用的大小。

(gdb) x/4d $esp+0x2c 
0xbffff44c: 5 134513856 0 -1073744680 

還有你的5.至於其他3個數字,他們是進一步堆疊的東西。

(gdb) x/4a $esp+0x2c 
0xbffff44c: 0x5 0x80484c0 <__libc_csu_init> 0x0 0xbffff4d8 

你的下一個問題:

,我發現是下面的......我敢肯定的是,第一個值是garbages另一個有趣的事情。但是爲什麼當它應該打印實際值時,它認爲0x5是一個地址?

Breakpoint 3, adding (a=5, b=6, c=7) at functioncalling.c:21 
21 e = a+b+c; 
(gdb) x/s a 
0x5: <Address 0x5 out of bounds> 

x命令,給定的程序的變量作爲參數的情況下,檢索它的值,並使用該作爲地址。 x/s a表示檢索a中的值並將其用作NUL終止字符串的起始地址。如果a類型爲char *且包含合適的值,則x/s將打印合理的輸出。要打印a的實際值,請給x命令指定參數&a

(gdb) x/wd &a 
0xbffff44c: 5 

這似乎違反直覺。只要考慮x命令就像C語句printf(fmt, *(argument))那樣操作即可。 x命令的參數幾乎總是一個文字存儲器地址或涉及堆棧指針,基址指針或pc寄存器的地址表達式。