Linux下C/C++调试工具gdb简介
GDB(GNU Debugger)是Linux下的一个调试工具,具体的功能有:
- 设置断点,使得代码在制定行暂停执行;
- 单步调试程序;
- 查看程序中的变量值的变化;
- 动态改变程序的执行环境;
- 分析崩溃程序产生的core文件;
假设我们有源文件hello.c
,要使用GDB进行调试,在程序编译时就必须使用-g
或者-gdb
选项:
gcc -Wall -g hello.c -o hello
-Wall
选项使得gcc尽可能产生多的告警信息,
然后使用命令:
gdb hello
接下来就可以进行调试了,调试的窗口:
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
... //没有全部复制
Reading symbols from simple_gdb...done.
(gdb) //这里就可以输入调试命令
常见的调试命令有:
File //装入想要调试的可执行文件
run //执行当前被调试的程序
kill //终止调试程序
step //执行一行源代码进入函数内部
next //执行一行源代码不进入函数内部
break //设置断点后,程序会在这里被挂起
print //打印变量或者表达式的值
display //设置自动显示的变量或者表达式
list //列出可执行文件的源代码的一部分
quit //退出gdb程序
watch //监视一个变量的值
backtrace //回溯跟踪
frame n //定位到错误行,n为输出结果中的行号
examine //查看内存地址的值
jump //使程序跳转执行
signal //产生信号量
return //强制函数返回
call //强制调用函数
make //使用户不退出gdb就重新生成可执行文件
shell //使用户不离开gdb就执行Linux命令
1. 断点调试
使用break设置断点,常见的命令如下:
break [function] //在指定函数中停住,对于C++的类/重载函数,可以使用class::function或者function(type...)格式指定对应函数
break [linenum] //在指定行号停住
break +[offset] //在本行号前面offset停住
break -[offset]
break [filename:linenum]
break [filename:function]
break [*address] //在运行的内存地址处停住
break //在下一条指令处停住
break [...] if<condition> //在条件成立是停住
例如:
break main //在main函数打断点
未完待续