Linux初始——cgdb
cgdb
- 前言
- cgdb的具体操作
前言
gdb与cgdb都是调试工具,更推荐使用cgdb,其会把代码给显示出来,更加方便。
但正常的gcc编译的文件是没有编译信息的,换句话说,gcc
默认编译的可执行文件是release版本的,而调试需要debug版本。通过gcc -g
就可以生成带有调试信息的可执行文件,可以通过readelf -S | grep -i debug
来观察是否有调试信息
cgdb的具体操作
命令 | 作用 | 样例及说明 |
---|---|---|
list/l | 显示源代码,从上次位置开始,每次列出10行 | list/l 10 |
list/l 函数名 | 列出指定函数的源代码 | list/l main |
list/l 文件名:行号 | 列出指定文件的源代码 | list/l mycmd.c:1 |
r/run | 从程序开始连续执行 | 如果没有断点就会直接运行程序,有断点则进入断点 |
n/next | 单步执行,不进入函数内部 | 类似与VS2022中的F10 |
s/step | 单步执行,进入函数内部 | 类似与VS2022中的F11 |
break/b [文件名:]行号 | 在指定行号设置断点 | b 10 b test.c:10 |
break/b 函数名 | 在函数开头设置断点 | b main |
info break/b | 查看当前所有断点的信息 | info b |
finish | 执行到当前函数返回,然后停止 | 即立即结束当前所在的函数 |
print/p 表达式 | 打印表达式的值 | 可以打印任何东西和监视不同 |
set var 变量=值 | 修改变量的值 | set var i=10 |
continue/c | 从当前位置开始连续执行程序 | 如果有多个断点则移动到下一个断点 |
delete/d breakpoints | 删除所有断点 | 注意每次打断点会有序号 |
delete/d breakpoints n | 删除序列为n的断点 | d breakpoints 1 |
disable breakpoints | 禁用所有断点 | |
enable breakpoints | 启用所有断点 | |
display 变量名 | 跟踪显示指定变量的值(每次停止时) | 类似与监视,与后续的watch 区分 |
undisplay 编号 | 取消对指定编号的变量的跟踪显示 | undisplay 1 |
until X行号 | 执行到指定行号 | until 20 |
watch 变量 | 执行时监视一个表达式(如变量)的值。如果监视的表达式在程序运行期间的值发生变化,GDB 会暂停程序的执行,并通知使用者 | display类似于监视,不管是否变化都会显示,而watch只有在变量发生变化时才会显示![]() |
条件断点 | 在满足某一条件时添加断点 | 新增条件断点: b 行号/文件名:行号/函数名 if i == 30(条件) 给已有断点追加:condition 2 i==30, 其中2是已有断点编号,没有if |