- 内核转储文件
当系统开启内核转储文件后, 当程序发生崩溃时就能够记录出内存中的所有信息
# 查看允许内核转储文件的大小, 默认为 0, 既不会生成内核转储文件
ulimit -c
# linux 开启内核转储文件
ulimit -c unlimited # 关闭的话此处设置为 0
# 查看转储文件生成的位置
sysctl kernel.core_pattern
# 使用 gdb 对转储文件进行调试
gdb -c [生成的转储文件] [debug型的源程序]
- gdb 使用 1
调试命令
命令 | 说明 |
---|---|
run [程序参数] | 运行程序, 并停止到第一个断点 |
start | 运行程序,并停止到 main 函数处 |
b[reak] [文件名:] 函数名|行号 | 在函数名或行号上下断点 |
watch|awatch|rwatch 变量 | 添加监控变量点 |
d[elete] | 删除断点或者监控点 |
n[ext] | 单步执行 |
s[tep] | 单步进入 |
c [n] | 跳到下 n 个断点处 |
信息查看命令
命令 | 说明 |
---|---|
l [文件名:]行号 | 展示该行附近的代码 |
info break | 展示断点信息 |
bt | 展示函数调用信息 |
print 变量 | 打印变量 |
info reg | 展示寄存器信息 |
# 修改变量的值
set variable 变量=值
# 调试的信息写入转储文件中
generate-core-file
- gdb 使用 2
命令 | 说明 |
---|---|
attach pid | 调试执行中的进程 |
detach | 使进程从 gdb 中脱离出来 |
clear | 删除断点 |
disable | 临时禁用断点 |
enable | 恢复断点 |
info proc | 查看进程信息 |
- Oops 信息解读
Oops 是内核发生致命错误时输出的内核信息
- SIGSEGV(segmentation fault 段错误): 非法访问内存操作
- nullptr 访问
- 指针被破坏导致非法地址访问
- 栈溢出导致非法地址访问