一.
touch mycode.c
vim mycode.c
cgdb 下载
Ubuntu:sudo apt-get install -y cgdb
Centos: sudo yum install -y cgdb
Linux 下我们编译好的代码无法直接调试
g++/gcc 默认的工作模式是release模式
程序要调试,必须是debug模式,编译时要加-g选项 gdb 携带调试信息的exe
-g 选项,让最后形成的可执行程序,添加调试信息 --- debug 模式
cgdb后面不是跟源文件,跟的是可执行程序,我们要调试的是可执行程序
开始 --> cgdb 可执行程序
上面是代码界面,下面是debug界面
我们软件一旦启动默认跑到结束
可以打断点运行到断点位置
怎么打断点?
-->
1) b 文件名:行号
2)b 文件名:main
3) 忽略这些直接打断点
b 行号
查看断点和删除断点
info b 查看当前所有断点的信息
d n 删除编号为n的断点
gdb 不退出,断点变化依次增加
在第18行设置一个
n /next 单步执行,不进入函数内部
r一下
s/step 单步执行,进入函数内部,gdb 会自动记录最新的一条输入指令
bt 查看当前执行栈的各级函数调用及参数
finish 执行到当前函数返回,然后停止
p 变量 打印指定变量的值
disable 和 enable
disable 禁用断点
enable 启用断点
退出 --> 我们输入quit 调试命令 或者 ctrl + d
l 文件名:行号 ---> 列出指定文件的源代码
l/list 显示源代码从上次位置开始,每次列出10行
就可以看到我们的debug信息
不行的话,使用这个
二.调试的本质
我们调试的本质是什么?
1.找到问题
1.1 断点的本质-->是把代码进行块级别划分,以块为单位进行快速定位区域
我们修改一下文件内容
设置断点
c/continue 从当前位置开始连续执行程序
until 行号,执行到指定行号
1.2 局部区域内快速执行
1.3 finish 确认问题是否在函数内
三.现在我们设置一个问题,来找到这个问题
display 变量名 , 跟踪显示指定变量的值(每次停止时)
undisplay 编号 , 取消对指定编号的变量的跟踪显示
再n
发现问题
infor/i locals 查看当前栈帧的局部变量值
四.补充:
watch
执行时监视一个表达式(变量)的值,如果监视的表达式在程序在程序运行期间的值发生变化,gdb会暂停程序的运行,并通知使用者
如果有一些变量不应该修改,但是我们怀疑他修改导致出现了问题,我们可以watch它,如果变化了,就会通知我们