2010年8月5日 星期四

[GNU 程式設計] C 及 C++ 程式除錯器 : 單步執行

前言 : 
gdb 有兩種方式可以進入單步執行. 當 next 命令碰到函式呼叫時, 會執行完整函式, 而 step 命令則會進入函式並一步執行一指令. 為解釋兩種命令的差別, 請參考下面範例說明. 

範例說明 : 
* step 指令說明 : 
(gdb) break main <在main 入口設斷點> 
Breakpoint 1 at 0x8048470: file string_test.c, line 5. 
(gdb) run <執行程式> 
Starting program: /usr/home/benjamin/src/test/test 

Breakpoint 1, main () at string_test.c:5 
warning: Source file is more recent than executable. 

5 int main(){ 
(gdb) step <繼續執行程式> 
main () at string_test.c:6 
6 int testi=0; 
(gdb) step <一次執行一行程式, 繼續執行> 
7 printf("Test\n"); 
(gdb) step <一次執行一行程式, 繼續執行> 
Test 
8 int itt[2]={0,1}; 
(gdb) step <一次執行一行程式, 繼續執行> 
9 hello("John"); 
(gdb) step <進入hello() 函式, 繼續執行> 
hello (name=0x80485e6 "John") at string_test.c:22 
22 printf("Hello %s\n", name); 
(gdb) step <一次執行一行程式, 繼續執行> 
Hello John 
23 }(gdb) step <一次執行一行程式, 繼續執行> 
main () at string_test.c:10 
10 printf("%d\n",itt[0]); 
(gdb) 

我們在 main 函式設一中斷點並作單步執行. 幾步後, 我們到了呼叫 hello 函式處, 這時 step 命令會進入 hello() 函式. step 會"走進" 函式, 而非整個執行完畢. 

* next 指令說明 : 
相形之下, next 命令會執行完整個 hello() 函式而不進入函式 : 
(gdb) break main <在 main 函式入口設斷點> 
Breakpoint 1 at 0x8048470: file string_test.c, line 5. 
(gdb) run <執行程式> 
Starting program: /usr/home/benjamin/src/test/test 

Breakpoint 1, main () at string_test.c:5 
warning: Source file is more recent than executable. 

5 int main(){ 
(gdb) next <執行一行程式> 
main () at string_test.c:6 
6 int testi=0; 
(gdb) next <執行一行程式> 
7 printf("Test\n"); 
(gdb) next <執行一行程式> 
Test 
8 int itt[2]={0,1}; 
(gdb) next <執行一行程式> 
9 hello("John"); 
(gdb) next <執行一行程式, 但是不進入 hello() 函式> 
Hello John 
10 printf("%d\n",itt[0]); 
(gdb) 

step 及 next 甚至在沒有原始程式檔案的情況下仍然可以作用, 但是 step 命令不會走進內建或是函式庫函式.

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...