Linux调试器gdb和cgdb的利用【Ubuntu】

打印 上一主题 下一主题

主题 838|帖子 838|积分 2514

一、样例代码

  1. // mycmd.c
  2. #include <stdio.h>
  3. int Sum(int s, int e)
  4. {
  5.         int result = 0;
  6.         for(int i = s; i <= e; i++)
  7.         {
  8.                 result += i;
  9.         }
  10.        
  11.         return result;
  12. }
  13. int main()
  14. {
  15.         int start = 1;
  16.         int end = 100;
  17.         printf("I will begin\n");
  18.         int n = Sum(start, end);
  19.         printf("running done, result is: [%d-%d]=%d\n", start, end, n);
  20.         return 0;
  21. }
复制代码
二、准备

• 程序的发布方式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的二进制程序,默认是 release 模式。
• 要利用gdb调试,必须在源代码生成二进制程序的时间, 加上 -g 选项,如果没有添加,程序无法被编译
  1. $ gcc mycmd.c -o mycmd  # 默认模式,不支持调试
  2. $ file mycmd          
  3. mycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
  4. linked, interpreter /lib64/ld-linux-x86-64.so.2,
  5. BuildID[sha1]=82f5cbaada10a9987d9f325384861a88d278b160, for GNU/Linux
  6. 3.2.0, not stripped
  7. $ gcc mycmd.c -o mycmd -g  # debug模式
  8. $ file mycmd       
  9. mycmd: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
  10. linked, interpreter /lib64/ld-linux-x86-64.so.2,
  11. BuildID[sha1]=3d5a2317809ef86c7827e9199cfefa622e3c187f, for GNU/Linux
  12. 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

  • -断点(breakpoints) -行号(n)
四、常见本领

回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表