GDB是UNIX及UNIX-like下的调试工具,通常gdb使用前置条件:编译时加入debug信息,这里指的是C++。

  gcc/g++调试选项

     gcc/g++是在编译时加入-g,-g分4个等级:

  1. -g0等于不加-g;即不包含任何信息
  2. -g1只包含最小信息,一般来说只有你不需要debug,只需要backtrace信息,并且真的很在意程序大小,或者有其他保密/特殊需求时才会使用-g1
  3. –g2为gdb默认等级,包含绝大多数你需要的信息
  4. –g3包含一些额外信息,例如包含宏定义信息

  关于gcc/g++优化级别,总结如下:

    gcc/g++ -O选项,gcc编译C,g++编译C++,-O分4个等级:

  1. -O0编译不优化,如果指定了多个-o选项,不管带不带数字,最后一个选项才是生效的选项
  2. -O1是最基本的优化等级。编译器会在不花费太多编译时间的同时试图生成更快更小的代码。这些优化是非常基础的,但一般这些任务肯定能顺利完成
  3. -O2是推荐的优化等级,除非你有特殊的需求。-O2会比-O1启用多一些标记。设置了-O2后,编译器会试图提高代码性能而不会增大体积和大量占用的编译时间
  4. -O3是最高最危险的优化等级。用这个选项会延长编译代码的时间,并且在使用gcc4.x的系统里不应全局启用。自从3.x版本以来gcc的行为已经有了极大地改变。在3.x,-O3生成的代码也只是比-O2快一点点而已,而gcc4.x中还未必更快。用-O3来编译所有的软件包将产生更大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)。这样做将得不偿失,记住过犹不及。在gcc 4.x.中使用-O3是不推荐的
  5. -Os这个等级用来优化代码尺寸。其中启用了-O2中不会增加磁盘空间占用的代码生成选项。这对于磁盘空间极其紧张或者CPU缓存较小的机器非常有用。但也可能产生些许问题,因此软件树中的大部分ebuild都过滤掉这个等级的优化。使用-Os是不推荐的

  GDB常用操作

  • 调试程序,gdb启动程序

      1.gdb 程序名,进入gdb后,使用run/r命令运行gdb调试,如果程序需要传递参数,run后面加[arg];

      2.如果程序需要传递参数,gdb --args 程序名 [arg],进入gdb后,使用run/r;

      3. 进入gdb后,输入程序名;如果需要给程序传递参数,使用set args  ["input"] 设定程序参数,再运行run/r,启动程序;

  • 调试正在运行的程序

      gdb attach [pid]

  • 查看源码

      list:list(l)  [函数名][行数],查看源码,简写l

  • 断点设置及管理

      break/b line_number :

        在line_number行上打断点,使程序在line_number行执行前停止

      break/b [filename]function_name:

        在filename文件下的function_name函数入口停止

      break/b [filename]line_number:

        在filename文件下的line_number行打断点

      break/b +offset/-offset :

        在当前行号的前面或后面offset停止

      break/b  where if condition :

        当某个条件满足时,在某一行停止; eg:在循环体中可以设置break ... if i = 100 来设置循环次数

      break/b :

        没有参数在下一行停止

      break/b  [内存地址] :

        在程序的运行地址处停止

      info break:

        显示当前的断点信息

        delete/d breakpoint_id:

        关闭断点

      disable/enable breakpoint_id:

        禁用/使能断点,该命令将禁止、允许断点 1,同时断点信息的 (Enb)域将变为 n、y

  • 运行命令

      run/r  [args] :run命令可以直接接命令行参数值

      set args ["input"]: 修改发送给程序的参数(进入GDB后才能使用)

      show args:查看其缺省参数的列表(进入GDB后才能使用)

  •  单步命令 

      next/n 不进入的单步执行

      step/s 进入的额单步执行

      finish 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值以及参数信息

      until :退出当前的循环体

  • 查看信息

      1.查看数据

        print  variable : 查看变量

        print  *array@len :查看数组(array是数组指针,len是需要数据长度)

        可以通过添加参数来设置输出格式:
                  /x 按十六进制格式显示变量
                  /d 按十进制格式显示变量
                  /u 按十六进制格式显示无符号整型
                  /o 按八进制格式显示变量
                  /t 按二进制格式显示变量
                  /a 按十六进制格式显示变量
                  /c 按字符格式显示变量
                  /f 按浮点数格式显示变量

      2.查看内存

         examine /n f u + 内存地址(指针变量)
                n 表示显示内存长度
                f 表示输出格式(见上)
                u 表示字节数制定(b 单字节;h 双字节;w 四字节;g 八字节;默认为四字节)

        如:
                    x /10cw pFilePath  (pFilePath为一个字符串指针,指针占4字节)
                    x 为examine命令的简写。

      3.查看栈信息

        backtrace [-n][n],简写bt
                n  表示只打印栈顶上n层的栈信息
                -n 表示只打印栈底上n层的栈信息
                不加参数,表示打印所有栈信息

  • 搜索

      search text:该命令可显示在当前文件中包含text串的下一行

      reverse-search text:该命令可以显示包含text 的前一行

  •  函数调用:

      call function:强制调用某函数,它会显示函数返回值(如果函数返回值不是void类型)

  • 调试进程

      gdb attach pid:调试已运行的进程,pid为进程号

  • 别的命令:

      cd :改变当前工作目录

      clear:删除刚才停止处的断点

      commands :命中断点时,列出将要执行的命令

       display :程序停止时显示变量和表达时

      up :上移栈帧,使另一函数成为当前函数

       down :下移栈帧,使得另一个函数成为当前函数

      frame :选择下一条continue命令的帧

      jump :在源程序中的另一点开始运行

       kill :异常终止在gdb 控制下运行的程序

       pwd :显示当前工作目录

          ptype :显示一个数据结构(如一个结构或C++类)的内容

       quit :退出gdb

       set variable ["args"] = "value":给变量赋值,变量为args,value为设定值

       signal :将一个信号发送到正在运行的进程

       undisplay display :命令的反命令,不要显示表达式

       watch :在程序中设置一个监测点(即数据断点)

       whatis :显示变量或函数类型

未完待续...

转载于:https://www.cnblogs.com/coder-zyc/p/9595691.html

GDB常用调试命令(一)相关推荐

  1. Linux+gcc设置断点,gcc/g++常用编译选项和gdb常用调试命令

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? gcc/g++编译器是我们写编译C/C++程序时离不开的编译工具,而gdb又是调试C/C++程序的利器,这一篇文章我们记 ...

  2. GDB常用调试命令以及多进程多线程调试

    今天把所有的GDB常用的调试命令都过了一遍,尤其是多线程调试.所以先做个总结,以免忘记.以后如果有新的有用的命令会继续追加. 本文地址:(LYanger的博客:http://blog.csdn.net ...

  3. gdb常用调试命令汇总!

    在debug模式下,使用GDB进行调试,可以使用的命令汇总如下: (gdb) p *(*pHead)->next   这里声明语句ListNode** pHead,表示查看*pHead执行链表节 ...

  4. Linux(gcc编译原理、过程以及常用调试命令)

    PS:红色字体表示重点,绿色字体表示重要标题,块引用中表示Linux终端中的命令. 1.gcc / g++的安装 命令:sudo apt install gcc /gcc+ 2.gcc编译连接 //m ...

  5. Bochs常用调试命令

    Bochs常用调试命令 Bochs是非常好用的模拟器,命令也很多,不过最常用的其实总结起来也就包括几条,记住这些命令基本都可以满足调试需求了. 1. 断点操作 (1)设置断点:b 物理地址 例:b 0 ...

  6. Rockchip Android平台常用调试命令汇总

    Rockchip Android平台常用调试命令汇总 文章目录 Rockchip Android平台常用调试命令汇总 查看帧率信息 查看显示图层信息 手动触发内核产生panic 通过命令设置Andro ...

  7. vxworks常用调试命令

    总结的vxworks常用调试命令,学习vxworks这些东西是必须的. 1.与任务相关的命令  sp, [arg1], ..., [arg9]     -启动任务,最多接受9个参数,默认的优先级100 ...

  8. gdb 跟踪调试命令整理

    内容源自于陈浩CSDN博客的用GDB调试程序一系列文章 用GDB调试程序(一) 用GDB调试程序(二) 用GDB调试程序(三) 用GDB调试程序(四) 用GDB调试程序(五) 用GDB调试程序(六) ...

  9. linux之gdb基本调试命令和使用总结

    1.gdb调试命令   描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或i) ...

  10. Linux之gdb基本调试命令与总结

    一.常见gdb调试命令 表1 gdb基本调试指令 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧 ...

最新文章

  1. [转载]IPMSG(飞鸽传书)协议翻译
  2. TOJ4537: n阶行列式
  3. qpython3安装kivy_kivy库的安装
  4. 如何系统地理解「交易平台」?
  5. Java中的24种设计模式与7大原则
  6. WUSTOJ 1299: 结点选择(Java)
  7. 常用文献管理软件使用经验
  8. C++第10周项目2扩展之2参考——迭代求和
  9. idea2020.2.2怎么创建web项目_创建Vue3.0的项目
  10. php如何增加字段,php如何增加字段
  11. java string的内存模型_Java String内存模型
  12. 数据库系统概论-关系数据库
  13. 坐标系投影转换CGCS2000坐标系(国家2000坐标系)等高线地形图
  14. android 电池权限,Android M及以上提示用户将APP加入电池优化白名单
  15. 实战!双硬盘安装图解!
  16. 调查报告:创意行业是否为远程办公做好准备?
  17. matlab实现正弦内插算法(低通滤波)
  18. 巴西龟饲养日志----肺炎治疗情况
  19. 35-文思海辉公司问题-info
  20. 【ASP.NET】System.Threading.ThreadAbortException中第一次偶然出现的“mscorlib.dll”类型的异常

热门文章

  1. 多线程下单例设计模式的实现
  2. ajax1—php(27)
  3. Asp.net文章内容分页
  4. Android 接收短信
  5. Visual C++ 6.0 简体中文企业版
  6. Guitar Pro如何更改五线谱的符杆方向
  7. 初识IOS,Label控件的应用。
  8. javascript删除数组某个元素
  9. Java期末设计(十三周)
  10. MySQL Workbench 导入导出乱码解决方法