调试工具总结
编译
- 使用-g option编译生成debug模式的可执行文件
- 尽量禁止编译器优化
- 尽量不要静态编译
- 使用高版本的gdb
- ulimit -c 设置core文件大小
gdb
- 基础操作
- gdb [exec-file [core-file/process-id]]
- file <exec-file>
- core <core-file>
- attach/detach <process-id>
- run/continue
- kill
- 断点调试
- break/b [<location>] [if <expr>]
- watch <cond> 表达式write时
- rwatch 表达式read时
- awatch 表达式read/write时
- 跟踪控制
- run/next/step/finish/continue 单步跟踪运行
- nexti/stepi 汇编指令级的单步运行
- jump <location> 控制程序的执行流,一般用于跳过/强制运行某些代码
- 查看变量、堆栈
- print
- examine/x[/nfu] <addr> 查看内存内容;n:看几个单位;f:显示格式;u:每个单位的长度
- e.g. x/1dw 0x7fffffffe39c
- backtrace/bt 显示当前调用的堆栈
- frame
- up
- down
- display
- info locals
- 查看源码
- list [<file-name>:]<line-number>
- TUI
- <C-x-a> 切换TUI模式
- <C-x-o> 切换窗口焦点
- layout <next/prev/src/asm/regs/split> 修改窗口布局
进阶技巧
其他调试辅助工具
- valgrind 用于内存调试、内存泄漏检测、性能分析
- valgrind [–leak-check=yes] <exec-file>
- 报警:内存越界,使用已释放内存,使用未初始化变量
- 程序需要能正常终止;速度较慢
- libefence.so
- strace/ltrace 在没有源码的情况下查看程序调用了哪个系统调用/库函数
Similar Posts