gdb调试
【前言】使用gdb调试前,在编译程序时,要加 -g 选项,否则你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
gdb -q a.out //-q(uiet)表示不打印gdb的版权信息
【调试环境】
1、【运行参数】
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。
2、【环境变量】
path <dir> 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。
3、【工作目录】
cd <dir> 相当于shell的cd命令。
pwd 显示当前的所在目录。
【设置观察点】
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
watch <expr>
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。[如watch i==100,当该条件成立时程序会暂停执行]
观察某个地址的数据变化 watch *(int*)0x00000000
【分割窗口】
layout:用于分割窗口,可以一边查看代码,一边测试:
layout src:显示源代码窗口
layout asm:显示反汇编窗口
layout regs:显示源代码/反汇编和CPU寄存器窗口
layout split:显示源代码和反汇编窗口
Ctrl + L:刷新窗口
1、开始调试
a. gdb <program>
program也就是你的执行文件,一般在当前目录下。
b. gdb <program> core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
2、【列出源码】,从第n行开始(编译时要加 -g 选项)
l n
3、【设置断点】在第N行加断点
break n
4、【设置断点】在函数func()入口处设置断点
break func
5、【查看断点信息】
info break
命中断点后自动打印调用栈
set pagination off
b malloc
commands
1 (1表示断点编号,用i b可以查询所有断点)
bt
continue
end
c
6、【单步执行】
n ----[next的缩写]
7、【继续运行】
c ----[continue的缩写]
8、【打印变量的值】
p varname
9、 【查看内存中数据】
x/<n/f/u> <addr>
n---正整数,表示需要显示的内存单元的个数
f---显示格式(format,如果要打字符串的话,可以用x/s,默认十六进制格式)
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量
u---每个单元大小(the unit size,从当前地址往后请求的位宽大小,如果不指定的话,gdb默认是4Bytes)
取值范围:
b---单字节
h---双字节
w---四字节
g---八字节
10、【查看调用栈】
bt
11、【退出函数】
finish
12、【退出gdb】
q ----[quit的缩写]
13、【gdb中执行shell命令】
shell <command string>
14、