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、

原文地址:https://www.cnblogs.com/cgc0415/p/7219817.html