对于很多开发者来说,开发过程中难免会遇到各种各样的bug, 所以,每个开发者应该考虑如何快速高效定位问题原因,而gdb是linux上很实用的调试工具,熟练掌握其调试技巧,将有助于提高解决问题的效率,也是开发者应该掌握的基本技能。

本文首先会讲解三种启动gdb的方式,然后再介绍两种查看堆栈信息的方法,最后再详细说明两种单步调试的实用技巧。

三种启动

通过gdb启动程序,通常有三种方式。下面分别进行讲解说明。

第一种方式是: gdb + 进程名。 编译程序的时候,需要加上-g选项,以便可执行程序中加入符号表信息,方便问题定位。

第二种方式,gdb –symbols=有符号表的进程 –exec=没有符号表的进程。首先创建没有符号表的进程,然后创建带有符号表的进程,最后再启动进程。

第三种方式,gdb -p 进程号。 这个方式也是最多使用的。因为进程崩溃的时候,仍然可以使用该方式,附着gdb到进程中,然后查看堆栈信息。

首先以后台运行的方式启动进程,然后查看进程的进程号,最后执行“gdb -p 进程号”的命令,把gdb附着到进程中,这样就可以很方便进行调试。

两种堆栈

当程序突然崩溃的时候,可以使用gdb附着到程序中,然后执行bt命令来查看最新的堆栈信息,这往往能够很快定位到问题的原因。

如果进程中启动很多线程,那么如何查看每个线程的堆栈信息呢,执行命令thread apply all bt,可以查看当前进程的所有线程的堆栈信息。

两种技巧

第一个技巧就是利用watch来观察某个变量的变化,当watch检测的变量发生变化的时候,gdb就会立即中断。

假设想要检测Fun函数下i_sum的变化情况,那么首先在该处设置断点,然后运行程序。

运行到断点位置的时候,程序停止,那么可以使用p命令打印变量的值,还可以查看变量的地址,最后还可以使用该地址来设置watch的观察点。

第二个技巧就是单步调试,它的好处就是让开发者可以轻松跟踪代码的流程,从而不需要通过添加日志的方式来确定代码的流程。

假设有如下所示的代码段,我们通过单步调试的方式来跟踪代码流程。首先,通过gdb启动程序,或者程序附着上gdb之后,设置断点,然后从断点处开始跟踪代码流程。

通过命令r启动程序,程序停止在断点处之后,使用n命令(next)进行单步运行,注意该命令不会进入函数内部跟踪。

那么如果想要进入函数,怎么办呢,可以使用s命令(step)来进入函数内部进行单步调试。

如果函数内部太长,不想要跟踪,那么可以输入命令finish, 直接跳出函数,注意该命令会执行完成函数之后,再退出。

而跳出函数,还有另一个命令return, 但是它不会执行完成函数再退出,而是直接退出。

最后补充一个查看局部变量的命令: info locals 。在断点位置的时候,使用该命令查看局部变量,有助于提高定位问题的效率。

总结

本文梳理了gdb的常用调试技巧,分别从三个方面进行说明,分别为三种启动、两种堆栈以及两种技巧。启动方式比较常用的是采用-p选项,将gdb附着到程序中。查看堆栈信息的命令bt适用于程序崩溃的问题,thread apply all bt命令则可以查看所有线程的堆栈信息。watch命令跟踪变量的变化情况。next则执行单步运行,但是不进入函数内部,step则会进入函数内部; 命令finish可以跳出函数,但是它会执行完成函数之后再退出;而命令return, 则不会执行完成函数,而是马上就退出。

gdb 命令_gdb实用的调试技巧:启动方式、堆栈信息、单步调试相关推荐

  1. 通过gdb core dump方法查看程序异常时的堆栈信息

    在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息.core dump叫做核心转储,当程序运行过程中发生异常的那一刻的一个内存快照,操作系 ...

  2. gdb调试 程序退出没有堆栈信息([Inferior 1 (process 12867) exited with code 0177])

    上周有新任务开发,然后周五开发完了,和其他同事联调(不能远程调试),发现客户端上报给server之后,serever莫名其妙的就挂了,然后被重新启动(重启是自己设置的,只要进程不存在就回去启动程序), ...

  3. UVM设计模式 (七)命令模式、三种sequence启动方式、start_item/finish_item、中介模式、virtual sequence

    本篇介绍UVM中的sequence,这是UVM中最基础的部分.对于前面介绍的uvm_callback, uvm_visitor等,很少被使用到或者也只有搭建平台的人会使用.不能认为平台的搭建更富有&q ...

  4. 如何在vscode上调试php,如何用vscode进行单步调试

    快捷键Ctrl + ` 打开默认终端; Ctrl + Shift + ` 新建新的终端; Ctrl + Shift + Y 打开调试控制台,然后再自行切换终端选项; ps: ` 在键盘数字1的左边. ...

  5. vscode怎么单步调试不了php,vscode如何单步调试

    vscode如何单步调试? vscode单步调试 VScode配置 0.快捷键Ctrl + ` 打开默认终端; Ctrl + Shift + ` 新建新的终端; Ctrl + Shift + Y 打开 ...

  6. android studio 单步调试jni,android studio实现Jni单步调试-标准配置教程

    本文主要介绍在android studio下实现jni单步调试时,所需要的配置及其步骤,这些也是本人经过几天折腾慢慢实现的,先提供给大家做参考: 1,配置是在mac下android studio实现的 ...

  7. 使用GDB命令行调试器调试C/C++程序

    编译自:http://xmodulo.com/gdb-command-line-debugger.html 作者: Adrien Brochard 原创:LCTT https://linux.cn/a ...

  8. 这10个实用的Javascript调试技巧,你知道吗?

    见过太多同学调试Javascript只会用简单的console.log甚至alert,看着真为他们着急.因为大多数同学追求优雅而高效地写代码,却忽略了如何优雅而高效地调试代码,不得不说是有点" ...

  9. linux下gdb单步调试

    用 GDB调试程序 GDB 概述 ---- GDB 是 GNU开源组织发布的一个强大的 UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像 VC. BCB等 IDE的调试,但如果你是在 ...

最新文章

  1. 2022-2028年中国汽车制动器行业投资分析及前景预测报告
  2. RobotFramework教程使用笔记——requests和requestslibrary库
  3. edem颗粒替换_EDEM后处理问题的大汇总,方便易懂!
  4. 判断远程图片是否存在的JavaScript代码
  5. python程序设计丁亚涛课后答案_python程序设计丁亚涛版课后答案
  6. C++实现拓扑排序(vector模拟邻接表存储,优先队列实现)
  7. Qt工作笔记-QML自定义圆形进度条(C++后端处理数据)
  8. 通过反射调用方法会大大降低性能
  9. 【图像处理】【去模糊】图像去模糊之初探--Single Image Motion Deblurring
  10. 对外汉语语料库有哪些_燃,9大对外汉语必备语料库,每个都很有“性格”!!...
  11. 用c#实现拍拍抢拍精灵实现过程--核心代码--腾讯qq拍拍网秒杀器代码
  12. 互联网盈利模式,网络策划运营模式
  13. 慎用Application.DoEvents( )
  14. 在WORD中批量修改图片大小
  15. 立波、海波、秀波,一波波秀得过亚马逊CEO最贵离婚案吗?
  16. Fabric单机多节点网络部署方案
  17. c语言程序设计勘误,《程序设计基础教程(C语言)》勘误表
  18. VSCode上的Git使用手记(持续更新ing...)
  19. SQL窗口函数-聚合窗口函数
  20. 继绿联、洛克之后,紫米也被举报涉嫌虚假宣传

热门文章

  1. 二进制的原码,反码,补码
  2. 图解 利用vue-cli 脚手架创建项目
  3. Java 基础系列之volatile变量(一)
  4. mybatis的Mapper文件配置
  5. 综合对比各个设计模式的思想
  6. 给电脑插入安卓手机那么在eclipse的DDMS视图里的Devices没设备信息
  7. 基于springcloud的声明式客户端FeignClients方式的httpserver访问配置
  8. JavaScript 图
  9. Android中通过ActionBar为标题栏添加搜索以及分享视窗
  10. position的用法小结