一、C语言调试—— gdb 的使用

1.1 gdb 调试工具常用命令

  • list:展开调试的源代码,缩写 l;
  • break:设置断点,缩写为 b;
  • info break:查看断点信息,缩写为 i b
  • delete:删除断点
  • print:打印变量的值,缩写为 p;
  • run:程序开始运行,缩写 r,在 r 后可以加入程序启动启动参数,程序运行到断点处暂停; 
  • step:单步调试,可以进入子函数,缩写为 s;
  • next:单步调试,不进入子函数,缩写为 n;
  • continue:程序继续运行,,到下一断点处暂停,缩写为 c;
  • set args:设置运行参数
  • show args:查看运行参数
  • gdb attatch pid:加载运行中的进程进行调式
  • dir dirname ... :指定源目录
  • x/28hx ---:以十六进程输出内存块数据
  • kill:停止调试
  • 段错误调试:
    • 通过 ulimit 命令查看一下系统是否配置支持了 dump core 的功能。通过 ulimit -c 或 ulimit -a,可以查看 core file 大小的配置的情况,如果为 0,则表示系统关闭了 dump core;可以通过 ulimit -c unlimited 来打开。若发生了段错误,但没有 core dump,是由于系统禁止  core 文件的生成。
    • gdb [exec file] [core file] | gdb -c corefile execfile
    • backtrace:查看堆栈信息,缩写为 bt,注意 run 到出错的地方后,运行此命令,可以查看到错误的地方
    • frame 堆栈错误编号:切换到编号处堆栈
    • 之后用 gdb 的通用调试命令查看参数等

 1.2 例子

  swap.c

 1 #include <stdio.h>
 2 
 3 void swap(int *a, int *b);
 4 void swap_error(int a, int b);
 5 
 6 int main(void)
 7 {
 8     int i = 3;
 9     int j = 5;
10 
11     printf("i: %d, j: %d\n", i, j);
12     swap(&i, &j);
13     printf("i: %d, j: %d\n", i, j);
14 
15     return 0;
16 }
17 
18 void swap(int *a, int *b)
19 {
20     int c = *a;
21     *a = *b;
22     *b = c;
23 }
24 
25 void swap_error(int a, int b)
26 {
27     int c = a;
28     a = b;
29     b = c;
30 }

  编译出目标文件(.o 文件): gcc -c -g -Wall swap.c

  编译出可执行文件:gcc -g -o app swap.o

  运行:gdb app

  运行 list 命令可以列出源码:

  

  list 后可以加函数名,列出函数,如 list main、list swap

  设置断点, break main(或者使用 break swap.c:main(或行号)) 和列出断点信息 info break,也可以通过 b 行号 设置断点

  

  运行程序,run(r) 命令:

  

  运行到下一行,next(n)命令:

  

  打印 i 的值,print(p) i:

  

  打印 i 的地址,p &i:

  

  进入子函数,step(s)命令:

  

  打印 a:

  

  a 的值与 i 的地址一样,即 a = &i

  删除断点,delete 断点标号:

  

 

   

    

  

  

 

转载于:https://www.cnblogs.com/kele-dad/p/10533475.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值