学习笔记:gdb

本文介绍了GDB作为调试命令工具的使用方法,包括如何编译带调试信息的程序,常用命令如`run`、`list`、`next`、`step`等,以及断点设置、变量追踪、内存查看等功能。详细讲解了`display`和`watch`命令在追踪变量上的区别,并强调了在不同函数帧中追踪变量的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GDB是调试命令工具

前提:编译的时候需要-g

使用:

  1. gdb a.out
  2. 或者gdb先进入,再输入file a.out

常用命令
gcc -g #使用该参数编译可执行文件,得到调试表

gdb a.out

gdb 命令行

  1. help:查看命令帮助,简写h。help + 命令

  2. run:开始运行程序,简写r。run args[1] args[2] …

  3. start:开始运行程序,单步执行,停在第一执行语句。 start args[1] args[2] …

  4. list:查看原代码,简写l。list n,从第n行开始查看代码。list 函数名,查看具体函数。

  5. set:设置变量的值,set args 1 2 3 4

  6. next:单步调试(逐过程,函数直接执行),简写n

  7. step:单步调试(逐语句:跳入自定义函数内部执行),简写s

  8. backtrace:查看函数的调用的栈帧和层级关系,简写bt!!!

  9. frame:切换函数的栈帧,简写f!!!

  10. info:查看函数内部局部变量的数值,简写i

  11. finish:结束当前函数,返回到函数调用点

  12. continue:继续运行,简写c

  13. print:打印值及地址,简写p。栈帧概念??backtrace,frame

  14. ptype x:打印变量类型,只能查看局部变量。栈帧概念??backtrace,frame

  15. quit:退出gdb,简写q

  16. break+num:在第num行设置断点,简写b, break num if i = 5(设置条件断点)

  17. info breakpoints:查看当前设置的所有断点,info b

  18. delete breakpoints num:删除第num个断点,简写d

  19. display i:追踪查看具体变量值, 跟踪变量i

  20. undisplay n:取消追踪观察变量,取消跟踪第n个变量

  21. watch i:跟踪变量i,被设置观察点的变量发生修改时,打印显示

  22. enable breakpoints n:启用断点

  23. disable breakpoints n:禁用断点

  24. x:查看内存x/20xw 显示20个单元,16进制,4字节每单元

使用场景

void insertionSort(int* nums,int numsSize){
	int i,j,key;
	for(i=0;i<numsSize;i++){
		key = nums[i];
		for(j=i-1;j>=0&&key<nums[j];j--)
			nums[j+1] = nums[j];
		nums[j+1] = key;
	}
}

int main(int argc,char **argv){
	int nums[] = {9,2,6,1,4,7,10,3};

	insertionSort(nums,sizeof(nums)/sizeof(int));

	insertionSort(nums,sizeof(nums)/sizeof(int));

	return 0;
}
  1. 设置断点break, 查看断点, 删除断点, 禁用断点
(gdb) l 1
1
2       void insertionSort(int* nums,int numsSize){
3               int i,j,key;
4               for(i=0;i<numsSize;i++){
5                       key = nums[i];
6                       for(j=i-1;j>=0&&key<nums[j];j--)
7                               nums[j+1] = nums[j];
8                       nums[j+1] = key;
9               }
10      }
(gdb)
11
12      int main(int argc,char **argv){
13              int nums[] = {9,2,6,1,4,7,10,3};
14
15              insertionSort(nums,sizeof(nums)/sizeof(int));
16
17              insertionSort(nums,sizeof(nums)/sizeof(int));
18
19              return 0;
20      }
(gdb) b 8
Breakpoint 1 at 0x105a0: file test.c, line 8.
(gdb) run
Starting program: /home/lyg001/test

Breakpoint 1, insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:8
8                       nums[j+1] = key;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.armv7hl libgcc-4.8.5-39.el7.armv7hl
(gdb) info b
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x000105a0 in insertionSort at test.c:8
        breakpoint already hit 1 time
(gdb) delete breakpoint 1
(gdb) b 4
Breakpoint 2 at 0x10508: file test.c, line 4.
(gdb) c
Continuing.

Breakpoint 2, insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) info b
Num     Type           Disp Enb Address    What
2       breakpoint     keep y   0x00010508 in insertionSort at test.c:4
        breakpoint already hit 1 time
(gdb) disable breakpoint 2
(gdb) c
Continuing.
[Inferior 1 (process 12922) exited normally]
(gdb) quit
  1. 追踪变量display
(gdb) display i
No symbol "i" in current context.
(gdb) s
15              insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) s
insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) display i
1: i = -1226347948
(gdb) s
5                       key = nums[i];
1: i = 0
(gdb) s
6                       for(j=i-1;j>=0&&key<nums[j];j--)
1: i = 0
(gdb) s
8                       nums[j+1] = key;
1: i = 0
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
1:   y  i
(gdb) finish
Run till exit from #0  insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:8
main (argc=1, argv=0xbefff564) at test.c:17
17              insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) s
insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
1: i = 8
(gdb) s
5                       key = nums[i];
1: i = 0
(gdb) undisplay 1
(gdb) s
6                       for(j=i-1;j>=0&&key<nums[j];j--)
(gdb) c
Continuing.
[Inferior 1 (process 13434) exited normally]
(gdb) quit

display必须在当前函数帧有同名变量。
当切换到不同函数帧时,还会显示同名变量。

  1. 追踪变量watch
(gdb) watch i
No symbol "i" in current context.
(gdb) start
Temporary breakpoint 1 at 0x105f8: file test.c, line 13.
Starting program: /home/lyg001/test

Temporary breakpoint 1, main (argc=1, argv=0xbefff564) at test.c:13
13              int nums[] = {9,2,6,1,4,7,10,3};
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.armv7hl libgcc-4.8.5-39.el7.armv7hl
(gdb) watch i
No symbol "i" in current context.
(gdb) s
15              insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) s
insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) watch i
Hardware watchpoint 2: i
(gdb) s
Hardware watchpoint 2: i

Old value = -1226347948
New value = 0
0x00010510 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) s
5                       key = nums[i];
(gdb) s
6                       for(j=i-1;j>=0&&key<nums[j];j--)
(gdb) s
8                       nums[j+1] = key;
(gdb) s
4               for(i=0;i<numsSize;i++){
(gdb) s
Hardware watchpoint 2: i

Old value = 0
New value = 1
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) finish
Run till exit from #0  0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
Hardware watchpoint 2: i

Old value = 1
New value = 2
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) finish
Run till exit from #0  0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
Hardware watchpoint 2: i

Old value = 2
New value = 3
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) finish
Run till exit from #0  0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
Hardware watchpoint 2: i

Old value = 3
New value = 4
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
Hardware watchpoint 2: i

Old value = 4
New value = 5
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
Hardware watchpoint 2: i

Old value = 5
New value = 6
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
Hardware watchpoint 2: i

Old value = 6
New value = 7
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
Hardware watchpoint 2: i

Old value = 7
New value = 8
0x000105c8 in insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) c
Continuing.

Watchpoint 2 deleted because the program has left the block in
which its expression is valid.
main (argc=1, argv=0xbefff564) at test.c:17
17              insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) s
insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) c
Continuing.
[Inferior 1 (process 13747) exited normally]

watch,必须在当前函数帧有同名变量。相当于break + print
当离开该函数帧后,不再生效

  1. 切换函数栈帧
(gdb) backtrace
No stack.
(gdb) start
Temporary breakpoint 1 at 0x105f8: file test.c, line 13.
Starting program: /home/lyg001/test

Temporary breakpoint 1, main (argc=1, argv=0xbefff564) at test.c:13
13              int nums[] = {9,2,6,1,4,7,10,3};
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.armv7hl libgcc-4.8.5-39.el7.armv7hl
(gdb) backtrace
#0  main (argc=1, argv=0xbefff564) at test.c:13
(gdb) s
15              insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) s
insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) backtrace
#0  insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
#1  0x00010628 in main (argc=1, argv=0xbefff564) at test.c:15
(gdb) print i
$1 = -1226347948
(gdb) frame 1
#1  0x00010628 in main (argc=1, argv=0xbefff564) at test.c:15
15              insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) print i
No symbol "i" in current context.
(gdb) frame 0
#0  insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
4               for(i=0;i<numsSize;i++){
(gdb) print i
$2 = -1226347948
(gdb) finish
Run till exit from #0  insertionSort (nums=0xbefff3f0, numsSize=8) at test.c:4
main (argc=1, argv=0xbefff564) at test.c:17
17              insertionSort(nums,sizeof(nums)/sizeof(int));
(gdb) backtrace
#0  main (argc=1, argv=0xbefff564) at test.c:17
(gdb) c
Continuing.
[Inferior 1 (process 14200) exited normally]
(gdb) quit

backtrace, frame, 切换函数帧, 才能打印想要的变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值