文章目录
前言
- 程序的发布方式有两种,debug模式和release模式
- Linux下使用gcc或g++编译器编译后得到的二进制程序,默认是release模式
- 要使用gdb调试,必须在源代码生成二进制程序的时候加上
-g
选项
示例:
release版本下进入调试:
debug版本下进入调试:
不同版本的可执行文件中的调试信息差异:
1 gdb的使用
**通过
gdb 可执行文件(debug版本)
可进入调试界面。**
1.1 常用调试命令
注意:所有查看内容的指令,不影响实际的调试指令。
quit(q)
:退出gdb调试器。- 源代码显示: 当我们通过gdb进入调试后,默认是不会显示出代码的,此时需要通过
list/l
命令将源代码显示出来:默认只输入l
表示每次随机从某一行代码开始向下显示出10行代码;输入l 0
则表示从最开始一行向下显示出10行代码;输入l 行号
表示从第指定行开始向下显示出10行代码。在一次显示后,紧接着输入回车则会继续向下显示接下来的10行代码(gdb会自动记录最近输入的一条命令);输入l 函数名
表示以该函数名所在行为中间行,显示其上下10行代码。 - 运行程序: 输入命令
run/r
表示运行程序,相当于VS下的快捷键F5
,如果没有添加任何断点,将直接运行完程序,若是碰到断点,则停下。
break(b) 行号
:在某一行设置断点。break(b) 函数名
:在某个函数开头(函数内的第一行代码)设置断点。也可以输入break(b) 文件名:函数名
在指定文件的某个函数开头设置断点。info break(b)
:查看断点信息。每个断点都有自己的编号,在不退出gdb的情况下断点编号会依次递增。delete breakpoints n(d n)
:删除编号为n(不是当前断点的行号)的断点。delete breakpoints(d)
:删除所有断点。disable breakpoints n
:禁用编号为n的断点,考虑到之后调试可能还需要用到某个断点,不想一次删除,可以使用该命令禁用断点,待到需要时再启用。enable breakpoints n
:启用编号为n的断点。next(n)
:单条执行,逐过程执行,不进入函数。step(s)
:逐语句执行,进入函数调用。breaktrace(bt)
:查看各级函数调用及参数。p 变量名
:查看变量值,每次查看时都需要输入命令。display 变量名
:跟踪查看一个变量(内置类型,结构体等自定义类型),每次停下来都显示它的值,每个跟踪的变量都有一个编号。(常显示)undisplay n(编号)
: 取消对先前设置的编号为n
的变量的跟踪。until n(行号)
:直接运行程序至第n
行。如当需要一次执行完某个循环时,即可使用该命令。finish
: 执行到当前函数返回,然后停下来等待命令。continue(c)
:从当前位置开始连续而非单步执行程序。可使程序从一个断点处直接运行到下一个断点处。set var
:修改变量值。print(p)
:打印表达式的值,通过表达式可以修改变量的值或调用函数。info(i) locals
:查看当前栈帧局部变量的值。
以上是我对Linux中gdb调试器使用的一些学习记录总结,如有错误,希望大家帮忙指正,也欢迎大家给予建议和讨论,谢谢!
版权归原作者 大米饭_Mirai 所有, 如有侵权,请联系我们删除。