应用场景
- 内存访问越界
- 多线程程序使用了线程不安全的函数
- 多线程读写的数据未加锁保护
- 非法指针
- 堆栈溢出
整体流程
通过添加”-g”的参数对程序文件进行编译
回溯跟踪指的是监视程序在运行过程中的函数调用历史,堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法.
- -g1 不包含局部变量和与行号有关的调试信息,只能用于回溯跟踪和堆栈转储之用。
- -g2 此时调试信息包括扩展的符号表、行号、局部或外部变量信息**(默认level)**
- -g3 包含级别2中的调试信息和源代码中定义的宏
配置设备端的core文件大小
ulimit -a 查看当前的各种用户进程限制
ulimit -c unlimited 开启Coredump,并且不限制文件的大小执行可执行程序, 生成core文件
将core文件取出, 执行 “gdb ./test core”进行分析
gdb
流程
- gdb 进入环境
- file a.out(可执行文件名) 加载可执行文件
- 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 | 继续运行 |
p | 打印值及地址 | |
break | b | 设置断点 |
disable | 失能断点 | |
delete | d | 删除断点 |
watch | w | 设置观察点 |
quit | q | 退出gdb |
命令 | 简写 | 含义 |
---|---|---|
info args | 查看参数 | |
info locals | 查看本地变量 | |
info sharedlibrary | 显示共享链接库的信息 | |
info breakpoints | info b | 显示断点 |
Q&A
Q:没有生成core文件?
A:kernel没有选择coredump功能,make kernel-menuconfig配置选项中选择coredump(第一个即可)Q:gdb无法显示so动态库的信息或者显示信息有误时
A:通常是由于库搜索路径错误导致的 ; 使用set sysroot / , 然后再次tb可以看到库中的函数
Q:无法清屏?
A:gdb中没有专门的清屏命令, 但是可以执行shell的命令进行清屏(shell clear)