一、样例代码
- // mycmd.c
- #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 模式。
• 要利用gdb调试,必须在源代码生成二进制程序的时间, 加上 -g 选项,如果没有添加,程序无法被编译
- $ gcc mycmd.c -o mycmd # 默认模式,不支持调试
- $ file mycmd
- mycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
- linked, interpreter /lib64/ld-linux-x86-64.so.2,
- BuildID[sha1]=82f5cbaada10a9987d9f325384861a88d278b160, for GNU/Linux
- 3.2.0, not stripped
- $ gcc mycmd.c -o mycmd -g # debug模式
- $ file mycmd
- mycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
- linked, interpreter /lib64/ld-linux-x86-64.so.2,
- BuildID[sha1]=3d5a2317809ef86c7827e9199cfefa622e3c187f, for GNU/Linux
- 3.2.0, with debug_info, not stripped
复制代码 三、常见利用
- 开始: gdb binFile
- 退出: ctrl + d 或 quit 调试命令
1、cgdb调试操纵
按下ESC键进入代码窗口,此时可以上下浏览代码,并且可以进行一系列的操纵:
按键操纵空格键设置或者取消断点;o查察代码所在的文件;/ 或者 ?在代码中搜索字符串;-缩小代码窗口;+扩大代码窗口;gg光标移动到文件头部;GG光标移动到文件尾部;ctrl + b代码向上翻一页;ctrl + u代码向上翻半页;ctrl + f代码向下翻一页;ctrl + d代码向下翻半页; 按下i键回到调试窗口,进入调试模式,利用的调试指令与GDB险些一样!
2、gdb调试操纵
命令作用样例list/l显⽰源代码,从上次位置开始,每次列出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 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
四、常见本领
|