前言
使用gdb调试前,在编译程序时,要加 -g 选项,否则你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
1 | gdb -q a.out // -q(uiet)表示不打印gdb的版权信息 |
调试环境
运行参数
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。
环境变量
path
可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。
工作目录
cd
相当于shell的cd命令。
pwd 显示当前的所在目录。
设置观察点
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
1 | watch <expr> |
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。[如watch i==100,当该条件成立时程序会暂停执行]
观察某个地址的数据变化 watch (int)0x00000000
分割窗口
layout:用于分割窗口,可以一边查看代码,一边测试:
layout src:显示源代码窗口
layout asm:显示反汇编窗口
layout regs:显示源代码/反汇编和CPU寄存器窗口
layout split:显示源代码和反汇编窗口
Ctrl + L:刷新窗口
调试过程
开始调试
a. gdb
program也就是你的执行文件,一般在当前目录下。
b. gdb
core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
列出源码
从第n行开始(编译时要加 -g 选项)
l n
设置断点
1 | break n //在第n行添加断点 |
查看断点信息
1 | info break |
断点命中后自动打印调用栈
1 | set pagination off |
单步执行
n —>next的首字母
继续执行
c —>continue的首字母
打印变量的值
p varname
查看调用栈
bt
退出函数
finish
退出gdb
q —>quit的首字母
gdb中执行shell命令
shell