C++ 代码调试
启动 gdb
使用条件:编译时加入 debug 信息,即 gcc -g
.
进入调试:1
2
3gdb <program> # 直接调试可执行文件
gdb <program> <core dump file> # 查 core
gdb <program> <PID> # 调试已经启动的程序
常用命令
- bt : backtrace. 显示当前调用栈
- f n : 切换到第 n 个栈帧
- i locals : 查看当前栈帧包含的局部变量
- i threads : 查看当前进程的线程
- b : break. 给程序加断点
- i b : 查看当前所有断点信息
- b n : 在当前栈帧所属的文件的第 n 行处加断点
- b fun : 在函数 fun 的入口处加断点
- d n : 删除断点号 i
- disable n : 暂时禁用断点 n
- enable n : 启用断点 n
- d breakpoints : 删除所有断点
- watch $rbx == 0x00ffffff00 : 监控寄存器,当值为 0x00ffffff00 时暂停,和加断点是一样的效果,同样也可监控变量的值
- r : run. 启动程序,直到第一个断点处,或等待用户输入
- c : continue. 继续执行,直到下一个断点处,或等待用户输入
- n : next. 执行下一条语句,不进入函数内部
- s : step. 执行下一条语句,进入函数内部
- x/i $pc : 显示下一条要执行的指令
- x/16x 0x7fffffffe8a0 : 显示从地址0x7fffffffe8a0 开始的 16 字节的内存的内容
- si : 执行下一条指令
- si n : 执行后 n 条指令
- until : 运行程序知道退出循环
- until n : 运行至第 n 行
- disassemble /rm : 查看当前栈帧的汇编代码, /r : 显示16进制的指令号; /m : 显示相应的源码
- i registers : 打印当前寄存器的值
- i registers rbp rsp : 显示寄存器 rbp,rsp 的值
- set $rsp -= 0x10 : 设置寄存器 rsp 的值
- set $tmp = 0 : 设置临时变量 tmp
- k : kill. 杀掉进程
- shell ls : 执行 shell 命令
- p var : 打印变量 var 的值
- whatis var : 显示变量 var 的类型
- pt var : ptype. 显示变量 var 的类型的定义
启用gdb命令历史
在 ~/.gdbinit 中添加:
1 | set history filename ~/.gdb_history |
cgdb
优点:
- 比 gdb 更加好用的调试工具,调试时可以同步看到源码
- 自动保存命令历史