2016-08-26 30 views
0

我正在使用gdb執行一些代碼分析。只是假設程序是像進入使用GDB

#include<stdio.h> 

getinput() 
{ 
    char buffer[8]; 
    gets(buffer); 
    puts(buffer); 
} 
int main() 
{ 
    getinput(); 
    return 0; 
} 

提到下面我用gcc withsome其他交換機遵守它:

gcc -ggdb -mpreferred-stack-boundary -fno-stack-protection -o demo demo.c 

在用gdb分析,當我插上getinput斷點(),並得到(緩衝液)函數.. 然後,使用「S」通過功能步驟..上得到(緩衝液)函數..

它不要求用戶輸入,而它要求userinput。 GDB直接步入函數獲取......但我不希望它移動到獲得功能..

(gdb) break 6 
Breakpoint 2 at 0x8048441: file demo.c, line 6. 
(gdb) s 
The program is not being run. 
(gdb) run 
Starting program: /root/BufferOverflow/demo 

Breakpoint 1, main() at demo.c:11 
11  getinput(); 
(gdb) s 

Breakpoint 2, getinput() at demo.c:6 
6  gets(buffer); 
(gdb) s 
_IO_gets (buf=0xbfffeda8 "y\204\004\b") at iogets.c:32 
32 iogets.c: No such file or directory. 
(gdb) 

我收到上述錯誤。任何人都可以請幫我關於這個?

回答

0

然後,使用 「S」 通過功能步驟..上得到(緩衝液)函數..

上線6使用step命令將步入gets()功能。如果你不想要這個,使用next命令。它將移動到getinput()函數中的下一行代碼(調用puts())。

0

gdb有多種方式來推進程序。一個很好的概述可以發現here

最常見的順序將是這樣的:

break [line or function/method] 
run args 
next 
print [interesting variables] 

next將跳過線路上的任何函數調用,並移動到下一源行當前功能。 step將步入功能。

如果不小心踩到一個不感興趣的功能,finish命令將運行直到當前函數結束。

一個常見的情況是進入一個評估參數的函數。

my_method(gets(buffer)); 

該行的一個步驟將引導您進入gets()函數的彙編程序。通常這不是你想要的。對於這種情況,我通常會在my_method上設置一個斷點,然後在cont上設置斷點。

gdb試圖通過step-mode設置來避免這種情況。它不總是工作,但你在你的例子中看到。

gdb是一個偉大的工具,可以節省您的時間和痛苦。如果你是一名開發人員,那麼肯定需要時間來掌握它。