程序中除了一些一目了然的BUG之外,都需要要一定的调试手段来分析程序到底错在哪了。到目前为止我们的调试手段只有一种:根据程序执行是的出错现象假设错误原因,然后在代码中适当的为止使用printf打印出结果,如果结果和预期一样,那么就基本证明了自己已经找到了错误原因了。
今天我们就来用一种非常强大的调试工具gdb,可以完全操控程序的运行,可以随心所欲的让程序走就走,让它停就停,并且可以随时查看程序中所有的内部状态,比如各个变量的值,传给函数的参数,当前执行语句的位置等等
Linux系统下安装gdb调试工具
要想使用gdb,必须要先安装,一般的linux发行版本都是自带gdb调试工具的,验证是否安装,在shell里面输入gdb 然后回车,如果出现如下图就证明已经安装了:
如果提示找不到命令,那就是你的系统没有安装gdb,需要安装后才能使用:
CentOS\Red hat系统使用下面命令安装:
sudo yum install gdb
Ubuntu系统请使用这条命令安装:
sudo apt-get install gdb
要想调试程序,就必须在源码使用gcc编译的时候 添加一个 -g 参数,让程序在编译的时候,产生调试信息。
gcc -g zploo.c -o zploo
gdb的常用命令:
help 可以简写为“h” 作用:按模块列出命令类
help class 作用:查看某一类型的具体命令
list 可以简写为“l” 作用:查看代码,可跟行号和函数名
quit 可以简写为“q” 作用:退出gdb
run 可以简写为 “r” 作用:全速运行程序
start 作用:单步执行,运行程序,停在第一行执行语句
next 可以简写为 “n” 作用:逐过程执行
step 可以简写为 “s” 作用:可以逐语句执行,遇到函数就进入函数内执行
info 可以简写为“i” 作用:查看gdb内部局部变量的数值,info breakpoints
frame 可有简写为“f” 作用:切换函数的栈帧
finish 作用:结束当前函数,返回到函数调用点
set 作用:设置变量的值 set var n=100
run argv[1] argv[2] 作用:调试时在命令行传参
print 可以简写为“p” 作用:打印变量和地址
break 可以简写为“b” 作用:设置断点,可根据行号和函数名
delete 可以简写为“d” 作用:删除断点 d brealpoints NUM
display 作用:设置观察变量
undisplay 作用:取消观察变量
continue 可以简写为“c” 继续全速运行剩下的代码
enable breakpoints 作用:启用断点
disable breakpoints 作用:禁用断点
x 作用:查看内存 x/20xw 显示20个单元,16进制,4个字节每单元
watch 作用:被设置观察点的变量发生修改时,打印显示
i watch 作用:显示观察点
core文件 作用:ulimit -c 1024 开启core文件,调试时使用 adb a.out core