程序猿的自我修养 Weilit

linux gdb调试笔记

2019-12-20

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            # 查看函数运行时堆栈,可以大概看出发生段错误之前最后执行的代码

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏博主

下一篇 CMake原理

留言