GDB使用总结
基本命令(gcc编译时须加上-g选项)
file <filename> 文件
l 查看源码
b 断点
info b 查看断点情况
r/run 运行
set args [...] 设置参数
show args 查看参数
n step over
s step in
c 运行到下一个断点
shell <...> 在gdb中执行shell命令
u 运行到某处
p <> 打印变量值
call fun(args) 调用函数
bt/backtrace 打印栈顶信息
gdb 进入gdb
q 退出gdb
特殊情况
Segmentation fault
段错误(Segmentation fault),一般指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。是C++代码中常见的错误,编译器提示非常简单,如下所示:
root@username:~# ./a.out
Segmentation fault (core dumped)
个人遇到该问题的几种情况:
- 编译生成的可执行文件
a.out
,无法直接运行(./a.out
报错Segmentation fault),但进入单步调试模式可正常执行完毕
经添加打印调试发现,该错误是由于指针越界造成的。
使用gdb调试Segmentation fault
:
g++ xx.cpp -g
gdb a.out
> run # 不加断电直接执行,会在Segmentation fault处报错停止
> bt # 查看函数运行时堆栈,可以大概看出发生段错误之前最后执行的代码