Skip to content

Latest commit

 

History

History
76 lines (57 loc) · 2.39 KB

gdb.md

File metadata and controls

76 lines (57 loc) · 2.39 KB

程序调试

工具使用

  • 内核转储文件

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

# 查看允许内核转储文件的大小, 默认为 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 段错误): 非法访问内存操作
  1. nullptr 访问
  2. 指针被破坏导致非法地址访问
  3. 栈溢出导致非法地址访问