程序的开发过程
debug和release
程序的发布版本有debug和release版本,debug就是可被调试的(debug环境下程序可以进行调试),release是发行版本,测试人员和用户使用的版本。Linux下我们编译代码时默认是release版本,debug版本的程序相较于release多了调试信息,所以大小会更大一点。
想要以debug环境编译代码需要在编译命令后+-g
,比如gcc code.c -g
。
我们在Linux中形成的可执行程序格式是ELF格式。可以通过指令readelf -S [可执行程序]
查看,debug版本的程序会多出一些信息。
gdb的使用
gdb是Linux系统的调试器,用于调试代码,必须是debug版本形成的可执行程序才能被调试!gdb会记录最近的历史命令,直接回车就是上一个命令
-
开始调试
gdb [可执行程序]
进入调试r(run)
开始调试
-
退出
ctel + d
或q(quit)
退出调试
-
看代码
l(list) 行号
跳转到对应行号,一次显示10行l(list) [函数名]
列出函数的源代码
-
打断点/删断点
-
b [行号]
在某一行打断点 -
b [文件名:行号]
在文件的某一行打断点 -
b [文件名:函数名]
对文件的某个函数打断点 -
b [函数名]
对某个函数打断点 -
info b(break)
查看断点信息,每一个断点都有一个编号 -
d [编号]
删除某一个断点 -
enable [编号]/disable [编号]
开启/关闭断点
-
-
逐语句/逐过程
n(next)
逐过程,就是VS的F10s(step)
逐语句,就是VS的F11
-
查看变量
-
p [变量]
打印变量值以下两个指令可以让想看的对象每运行一步都会打印出来
-
display [变量名/变量地址]
可以常显示想看的对象 -
undisplay [编号]
可以取消常显示编号所代表的对象
-
-
其他
until
运行至指定的位置(可能是指定位置的后面,因为指定的行可能是空行,会往后走找语句)finish
运行至当前函数的结尾c
从一个断点直接运行到下一个断点处(类似于VS的F5)bt
查看调用堆栈set var [变量] = [值]
在调试时更改变量的值info locals
查看当前栈帧局部变量的值
一个程序被调试的本质实际上是gdb在追踪这个进程