引言
? ? ? ? 在追尋光的路上不斷前行,詳細介紹Linux下gdb/cgdb的使用。
一、準備
? 程序的發布方式有兩種,默認是 debug 模式和 release 模式。Linux gcc/g++編譯出來的二進制程序默認是release模式
? 要使用gdb調試,必須在源代碼生成?進制程序的時候加上-g 選項,如果沒有添加,程序無法被 編譯
二、調試
1.進入調試界面
進入調試命令:gdb/cgdb? 可執行文件??
例如:
[zhangsan@hcss-ecs-f571 learn_25_9_12]$ cgdb code5x int Sum(int s, int e)6x {7x int result = 0;8x int i = 0;9x for(i = s; i <= e; i++)
10x {
11x result += i;
12x }
13x return result*flag;
14x }
15x
16x int main()
17x {
18t> int start = 1;
19x int end = 100;
20x printf("I will begin\n");
21x int n = Sum(start, end);
22x printf("running done, result is: [%d-%d]=%d\n", start, end, n);
23x return 0;
24x }
? [?1034h[?1034hGNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.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/zhangsan/learn_25_9_12/code...done.
(gdb)
Temporary breakpoint 1 at 0x4005c3: file code.c, line 18.
(gdb)
2.退出調試界面
命令:quit/q? 退出調試界面
3.開始調試
? ? ?? ?輸入r/run開始調試,默認會直接將代碼跑完,所以就需要打斷點
4.打斷點
? ? ? ? 輸入 b/break [文件名]:行號? ? 或
? ? ? ? 輸入 b/break 行號
來打斷點
? ? ? ? 命令:info/i? ??b/break? ? ?可以查看有哪些斷點
然后輸入r/run,程序運行時會從第一個斷點開始運行。
[zhangsan@hcss-ecs-f571 learn_25_9_12]$ cgdb code5x int Sum(int s, int e)6x {7x int result = 0;8x int i = 0;9x for(i = s; i <= e; i++)
10x {
11x result += i;
12x }
13x return result*flag;
14x }
15x
16x int main()
17x {
18x int start = 1;
19x int end = 100;
20t> printf("I will begin\n");
21x int n = Sum(start, end);
22x printf("running done, result is: [%d-%d]=%d\n", start, end, n);
23x return 0;
24x }
/home/zhangsan/learn_25_9_12/code.c
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/zhangsan/learn_25_9_12/code...done.
(gdb) b 20
Breakpoint 1 at 0x4005d1: file code.c, line 20.
(gdb) b 22
Breakpoint 2 at 0x4005ed: file code.c, line 22.
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004005d1 in main at code.c:20
2 breakpoint keep y 0x00000000004005ed in main at code.c:22
(gdb) r
Starting program: /home/zhangsan/learn_25_9_12/code Breakpoint 1, main () at code.c:20
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.3.x86_64
(gdb)
4.1打條件斷點
命令:b/break 行號 if 條件
如:b 11 if i == 10
(gdb) b 11 if i==10
Breakpoint 3 at 0x40059d: file code.c, line 11.
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004005d1 in main at code.c:20breakpoint already hit 1 time
2 breakpoint keep y 0x00000000004005ed in main at code.c:22
3 breakpoint keep y 0x000000000040059d in Sum at code.c:11stop only if i==10
(gdb)
4.2給已存在的斷點新增條件
命令:condition [條件序號] [條件]
如:condition 11 i == 10
解釋:條件序號就是info b命令后,Num對應的數子。
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040059d in Sum at code.c:11
(gdb) condition 1 i == 10
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040059d in Sum at code.c:11stop only if i == 10
(gdb)
5.逐過程調試,逐語句調試
?命令:n/next? ?單步執行,不進入函數內部,逐過程(F10)
?命令:s/step? ?單步執行,進入函數內部,逐語句(F11)
6.跳到下一個斷點調試
命令:c/continue? ?從當前位置開始連續執行程序(一個斷點跳到下一個斷點)
7.查看調試變量信息
命令:p [變量名]? ? ? ? ?打印指定變量的值
命令:display [變量名]? ? ?跟蹤顯示變量的值
命令:undisplay [編號]? ?取消對指定編號的變量的跟蹤顯示
(gdb) display i
1: i = 4195472
(gdb) n
1: i = 4195472
(gdb)
1: i = 0
(gdb)
1: i = 1
(gdb)
1: i = 1
(gdb)
1: i = 2
(gdb)
1: i = 2
(gdb)
1: i = 2
(gdb) undisplay 1
(gdb) n
(gdb)
8.禁用斷點,啟用斷點
命令:disable [編號]? ? ?禁用[編號]斷點
命令:disable breakpoints? ? 禁用所有斷點
命令:enable [編號]? ?啟用[編號]斷點
命令:enable? breakpoints? ?啟用所有斷點
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004005db in main at code.c:21breakpoint already hit 1 time
2 breakpoint keep n 0x000000000040059d in Sum at code.c:10
(gdb) disable breakpoints
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep n 0x00000000004005db in main at code.c:21breakpoint already hit 1 time
2 breakpoint keep n 0x000000000040059d in Sum at code.c:10
(gdb) enable breakpoints
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004005db in main at code.c:21breakpoint already hit 1 time
2 breakpoint keep y 0x000000000040059d in Sum at code.c:10
(gdb)
9.刪除斷點
命令:delete/d [編號]? ?刪除[編號]斷點
命令:delete/d breakpoints? ?刪除所以斷點
三、一些調試小技巧
命令:list/l? ?顯示源代碼,從上次位置開始,每次列出 10行
命令:list/l? 函數名? ? 列出指定函數的源代碼? ? ? ?如:l main
命令:list/l? 文件名:行號? ? ?列出指定文件位置的源代碼? ?如:l code.c? main
命令:finish? ? ?執行到當前函數返回,然后停止
如:在sum函數中執行時,輸入finish可以直接將sum函數執行完并返回,
若sum函數中有斷點,則執行到斷點位置處停止。
命令:p/print? [表達式]? ?打印表達式的值? ? ? ? ?如:print? x+y
命令:until? 行號? ? ? ? 執行到指定行號? ? ? ? ?如:until? 20
命令:backtrace/bt? ?查看當前執行棧的各級函數調用及參數
命令:info/i locals? ?查看當前棧幀的局部變量值? ? ? ? ? ? ? ? ??
(gdb) s
Sum (s=1, e=100) at code.c:7
(gdb) bt
#0 Sum (s=1, e=100) at code.c:7
#1 0x00000000004005ea in main () at code.c:21
(gdb) i locals
result = 0
i = 4195472
(gdb)
命令:watch
????????執行時監視?個表達式(如變量)的值。如果監視的表達式在程序運行期間的值發生變化,GDB會暫停程序的執行,并通知使用者
Sum (s=1, e=100) at code.c:9
(gdb)
(gdb)
Hardware watchpoint 3: resultOld value = 1
New value = 3
Sum (s=1, e=100) at code.c:9
(gdb)
(gdb)
Hardware watchpoint 3: resultOld value = 3
New value = 6
Sum (s=1, e=100) at code.c:9
(gdb)
Breakpoint 4 at 0x400595: file code.c, line 9.
(gdb) Quit
(gdb)
命令:set var [修改的條件]
? ? ? ? 可以在調試的時候暫時修改變量的值,方便確定問題在哪塊。