Fork me on GitHub
0%

gdb && coredump

应用场景

  • 内存访问越界
  • 多线程程序使用了线程不安全的函数
  • 多线程读写的数据未加锁保护
  • 非法指针
  • 堆栈溢出

整体流程

  1. 通过添加”-g”的参数对程序文件进行编译

    回溯跟踪指的是监视程序在运行过程中的函数调用历史,堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法.

    • -g1 不包含局部变量和与行号有关的调试信息,只能用于回溯跟踪和堆栈转储之用。
    • -g2 此时调试信息包括扩展的符号表、行号、局部或外部变量信息**(默认level)**
    • -g3 包含级别2中的调试信息和源代码中定义的宏
  2. 配置设备端的core文件大小
    ulimit -a 查看当前的各种用户进程限制
    ulimit -c unlimited 开启Coredump,并且不限制文件的大小

  3. 执行可执行程序, 生成core文件

  4. 将core文件取出, 执行 “gdb ./test core”进行分析

gdb

流程

  1. gdb 进入环境
  2. file a.out(可执行文件名) 加载可执行文件
  3. set args argv[1] argv[2] …… 加载a.out所需要的参数

命令

命令 简写 含义
run 重新开始运行文件
start 单步执行,运行程序,停在第一执行语句
list l 查看源代码
set 设置变量的值
next n 单步调试( 逐过程, 函数直接执行)
step s 单步调试( 逐语句, 跳入自定义函数内部执行)
backtrace bt 查看函数的调用栈帧和层级关系
frame f 切换栈帧, 直接使用frame + <bt前面的数字>
info i 查看函数内部局部变量的数值
finish 结束当前函数, 返回到函数调用的点
continue c 继续运行
print p 打印值及地址
break b 设置断点
disable 失能断点
delete d 删除断点
watch w 设置观察点
quit q 退出gdb
命令 简写 含义
info args 查看参数
info locals 查看本地变量
info sharedlibrary 显示共享链接库的信息
info breakpoints info b 显示断点

Q&A

  1. Q:没有生成core文件?
    A:kernel没有选择coredump功能,make kernel-menuconfig配置选项中选择coredump(第一个即可)

  2. Q:gdb无法显示so动态库的信息或者显示信息有误时

    A:通常是由于库搜索路径错误导致的 ; 使用set sysroot / , 然后再次tb可以看到库中的函数

  3. Q:无法清屏?

    A:gdb中没有专门的清屏命令, 但是可以执行shell的命令进行清屏(shell clear)

拓展资料