1.引入
- #include <stdio.h>
- int Sum(int s, int e)
- {
- int result = 0;
- for(int i = s; i <= e; i++)
- {
- result += i;
- }
- return result;
- }
- int main()
- {
- int start = 1;
- int end = 100;
- printf("I will begin\n");
- int n = Sum(start, end);
- printf("running done, result is: [%d-%d]=%d\n", start, end, n);
- return 0;
- }
复制代码 程序的发布⽅式有两种, 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)
细节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- #include <stdio.h>
- int flag = 0; // 故意错误
- //int flag = -1;
- //int flag = 1;
- int Sum(int s, int e)
- {
- int result = 0;
- for(int i = s; i <= e; i++)
- {
- result += i;
- }
- return result*flag;
- }
- int main()
- {
- int start = 1;
- int end = 100;
- printf("I will begin\n");
- int n = Sum(start, end);
- printf("running done, result is: [%d-%d]=%d\n", start, end, n);
- return 0;
- }
复制代码 运行出来结果为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企服之家,中国第一个企服评测及商务社交产业平台。
|