Linux調試器GDB使用

例程

#include <stdio.h>
int cal(int n)
{
    if (n == 1)
        return 1;
    else
        return n * cal(n - 1);
        
}


int main()
{
    int n = 5;
    n = cal(n);
    printf("%d", n);
    return 0;
}

gcc -g demo_gdb.c -o demo_gdb

參數 g 作用是把調試信息加入到生成文件中,否則GDB是無法調試的

開始調試

eselnts1615 [18:13] [/000test/linux] -> gdb demo_gdb
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-114.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/000test/linux/demo_gdb...done.
(gdb)

進入等待調試窗口

幾個常用的命令

(1)查看源文件

gcc可以給出產生警告或者錯誤的代碼行數
l (list的縮寫)

(gdb) l
4           if (n == 1)
5               return 1;
6           else
7               return n * cal(n - 1);
8               
9       }
10
11      int main()
12      {
13          int n = 5;
(gdb) l
14          n = cal(n);
15          printf("%d", n);
16          return 0;
17      }
18
(gdb) l
Line number 19 out of range; demo_gdb.c has 18 lines.

以10爲單位進行顯示,在運行一次就顯示下邊10行

(2)設置斷點

通過斷點可以知道每一步的執行情況(當前變量的值,函數是否調用,堆棧使用情況)

在第七行設置斷點,輸出該斷點在內存中的物理地址

(gdb) b 7
Breakpoint 1 at 0x400535: file demo_gdb.c, line 7.
(3)查看所有斷點
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400535 in cal at demo_gdb.c:7
(4)運行程序

r(run的縮寫),默認從代碼首行開始運行,如果又斷點,會在斷點的前一行暫定運行

(gdb) r
Starting program: /home/elixkan/elixkan/000test/linux/demo_gdb


Breakpoint 1, cal (n=5) at demo_gdb.c:7
7               return n * cal(n - 1);
(5)查看變量值

程序暫停後可以查看當前的狀態,p(print的縮寫)可以查看當前變量n的值

(gdb) p n
$1 = 5

顯示的方式是“N使N”來顯示變量的值,下次查看變量的時候,就可以直接使用“N”代替變量名了

(6)繼續運行程序

參數c可以繼續運行,由於cal函數是遞歸調用,程序會再次在斷點處停止

(gdb) c
Continuing.


Breakpoint 1, cal (n=4) at demo_gdb.c:7
7               return n * cal(n - 1);

暫停後可以繼續查看變量n的值

(gdb) p n
$2 = 4
(7)單步運行

複雜的函數有時候需要一步步運行,s(step的縮寫) n (next的縮寫)
s可以進入函數內部運行,但是n 不會進去

(gdb) s
cal (n=4) at demo_gdb.c:4
4           if (n == 1)
(gdb) s


Breakpoint 1, cal (n=4) at demo_gdb.c:7
7               return n * cal(n - 1);
(gdb) s
cal (n=3) at demo_gdb.c:4
4           if (n == 1)
(gdb) s


Breakpoint 1, cal (n=3) at demo_gdb.c:7
7               return n * cal(n - 1);
(gdb) s
cal (n=2) at demo_gdb.c:4
4           if (n == 1)
(gdb) s

Breakpoint 1, cal (n=2) at demo_gdb.c:7
7               return n * cal(n - 1);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章