GDB调试: 从入门实践到原理
一直有读者在问,能不能写一篇关于gdb调试方面的文章,今天借助此文,分享一些工作中的调试经验,希望能够帮到大家。 写在前面 在我的工作经历中,前几年在Windows上进行开发,使用Visual Studio进行调试,简直是利器,各种断点等用鼠标点点点就能设置;大概从12年开始转Linux开发了,所以调试都是基于GDB的。本来这篇文章也想写写Windows下调试相关,奈何好多年没用了,再加上工作太忙,所以本文就只写了Linux下GDB调试相关,对于Windows开发人员,实在对不住了😃。 这篇文章,涉及的比较全面,总结了这些年的gdb调试经验(都是小儿科😁),经常用到的一些调试技巧,希望能够对从事Linux开发的相关人员有所帮助 背景 作为C/C++开发人员,保证程序正常运行是最基本也是最主要的目的。而为了保证程序正常运行,调试则是最基本的手段,熟悉这些调试方式,可以方便我们更快的定位程序问题所在,提高开发效率。 在开发过程,如果程序的运行结果不符合预期,第一时间就是打开GDB进行调试,在对应的地方设置断点,然后分析原因;当线上服务出了问题,第一时间查看进程在不在,如果不在的话,是否生成了coredump文件,如果有,则使用gdb调试coredump文件,否则通过dmesg来分析内核日志来查找原因。 概念 GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、「基于命令行的、功能强大的程序调试工具」。 GDB支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在Linux环境软件开发中,GDB是主要的调试工具,用来调试C和 C++程序(也支持go等其他语言)。 常用命令 断点 断点是我们在调试中经常用的一个功能,我们在指定位置设置断点之后,程序运行到该位置将会暂停,这个时候我们就可以对程序进行更多的操作,比如查看变量内容,堆栈情况等等,以帮助我们调试程序。 以设置断点的命令分为以下几类: breakpoint watchpoint catchpoint breakpoint 可以根据行号、函数、条件生成断点,下面是相关命令以及对应的作用说明: 命令作用break [file]:function在文件file的function函数入口设置断点break [file]:line在文件file的第line行设置断点info breakpoints查看断点列表break [+-]offset在当前位置偏移量为[+-]offset处设置断点break *addr在地址addr处设置断点break ... if expr设置条件断点,仅仅在条件满足时ignore n count接下来对于编号为n的断点忽略count次clear删除所有断点clear function删除所有位于function内的断点delete n删除指定编号的断点enable n启用指定编号的断点disable n禁用指定编号的断点save breakpoints file保存断点信息到指定文件source file导入文件中保存的断点信息break在下一个指令处设置断点clear [file:]line删除第line行的断点 watchpoint watchpoint是一种特殊类型的断点,类似于正常断点,是要求GDB暂停程序执行的命令。区别在于watchpoint没有驻留某一行源代码中,而是指示GDB每当某个表达式改变了值就暂停执行的命令。 ...