Linux的调试器--gbd/cgbd

[复制链接]
发表于 2025-7-9 03:17:16 | 显示全部楼层 |阅读模式
1.引入
  1. #include <stdio.h>
  2. int Sum(int s, int e)
  3. {
  4.         int result = 0;
  5.         for(int i = s; i <= e; i++)
  6.         {
  7.                 result += i;
  8.         }
  9.         return result;
  10. }
  11. int main()
  12. {
  13.         int start = 1;
  14.         int end = 100;
  15.         printf("I will begin\n");
  16.         int n = Sum(start, end);
  17.         printf("running done, result is: [%d-%d]=%d\n", start, end, n);
  18.         return 0;
  19. }
复制代码
程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程 序,默认是 release 模式。这一点在我们window下比较直观。
要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时间, 加上 -g 选项,如果没有添加,程序⽆法被 编译。在创建好两种格式后我们可以看到他们的内存是不一样的。
2.gbd/cgbd的利用

一般环境下,我们更建议利用cgbd,因为cgbd会体现源代码
开始: gdb binFile退出: ctrl + d 或 quit 调试命令命令作用样例list/l体现源代码,从上次位置开始,每次列出 10 行list/l 10list/l 函数名列出指定函数的源代码list/l mainlist/l 文件名:行号列出指定文件的源代码list/l mycmd.c:1r/run从程序开始一连执行runn/next单步执行,不进入函数内部nexts/step单步执行,进入函数内部stepbreak/b [文件名:] 行号在指定行号设置断点break 10
                        break test.c:10break/b 函数名在函数开头设置断点break maininfo break/b检察当前全部断点的信息info breakfinish执行到当前函数返回,然后停止finishprint/p 表达式打印表达式的值print start+endp 变量打印指定变量的值p xset var 变量 = 值修改变量的值set var i=10continue/c从当前位置开始一连执行程序continuedelete/d breakpoints删除全部断点delete breakpointsdelete/d breakpoints n删除序号为 n 的断点delete breakpoints 1/d 1disable breakpoints禁用全部断点disable breakpointsenable breakpoints启用全部断点enable breakpointsinfo/i breakpoints检察当前设置的断点列表info breakpointsdisplay 变量名跟踪体现指定变量的值(每次停止时)display xundisplay 编号取消对指定编号的变量的跟踪体现undisplay 1until x 行号执行到指定行号until 20backtrace/bt检察当前执行栈的各级函数调用及参数backtraceinfo/i locals检察当前栈帧的局部变量值info localsquit退出 GDB 调试器quit对于一些常用的指令我们表明一下:(1)
r/run从程序开始一连执行run
细节1:gdb启动调试的时间,只是开启了gdb,被调试程序,并没有运行起来。
细节2:r/run,体现的是在gdb的场景中,启动我们自己的mycmd程序
细节3:在没有断点的环境下,r/run,就是 让我们的程序直接运行竣事
细节4:断点的本质功能:让我们的程序,在运行到指定的行,进行暂停!
(2)
n/next单步执行,不进入函数内部next
s/step单步执行,进入函数内部step
 这两条指令就相当于vs里的F10和F11。
(3)
continue/c从当前位置开始一连执行程序continue
运行到竣事大概下一个节点处
(4)
disable breakpoints禁用全部断点disable breakpoints
enable breakpoints启用全部断点enable breakpoints
为什么不删除?因为要保留调试痕迹
3. 调试本领

3.1watch

执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变革,GDB 会暂停程序的执⾏,并通知使⽤者。如果你有⼀些变量不应该修改,但是你怀疑它修改导致了题目,你可以watch它,如果变 化了,就会通知你。watch的检察和删除类似于断点,info检察,d删除。
3.2set var确定题目原因

在我们的测试案例中,更改⼀下标志位,假设我们想得到 +-result
  1. #include <stdio.h>
  2. int flag = 0; // 故意错误
  3. //int flag = -1;
  4. //int flag = 1;
  5. int Sum(int s, int e)
  6. {
  7. int result = 0;
  8. for(int i = s; i <= e; i++)
  9. {
  10. result += i;
  11. }
  12. return result*flag;
  13. }
  14. int main()
  15. {
  16. int start = 1;
  17. int end = 100;
  18. printf("I will begin\n");
  19. int n = Sum(start, end);
  20. printf("running done, result is: [%d-%d]=%d\n", start, end, n);
  21. return 0;
  22. }
复制代码
运行出来结果为0,但在调试的时间用set var flag=1改变flag的话就是5050。
3.3条件断点

利用方法:
b 行号 条件
eg. b 9 if i == 30 # 9是⾏号,表⽰新增断点的位置。
在原有的断点底子上:
condition 编号 条件

条件断点添加常⻅两种⽅式:1. 新增 2. 给已有断点追加 • 注意两者的语法有区别,不要写错了。 • 新增: b ⾏号/⽂件名:⾏号/函数名 if i == 30(条件) • 给已有断点追加:condition 2 i==30, 此中2是已有断点编号,没有if

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-7-25 08:17 , Processed in 0.078700 second(s), 31 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表