Skip to the content.

程序调试

工具使用

当系统开启内核转储文件后, 当程序发生崩溃时就能够记录出内存中的所有信息

# 查看允许内核转储文件的大小, 默认为 0, 既不会生成内核转储文件
ulimit -c
# linux 开启内核转储文件
ulimit -c unlimited # 关闭的话此处设置为 0
# 查看转储文件生成的位置
sysctl kernel.core_pattern

# 使用 gdb 对转储文件进行调试
gdb -c [生成的转储文件] [debug型的源程序]

调试命令

命令 说明
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
命令 说明
attach pid 调试执行中的进程
detach 使进程从 gdb 中脱离出来
clear 删除断点
disable 临时禁用断点
enable 恢复断点
info proc 查看进程信息

内核调试准备

Oops 是内核发生致命错误时输出的内核信息

应用程序调试

  1. nullptr 访问
  2. 指针被破坏导致非法地址访问
  3. 栈溢出导致非法地址访问