GDB

来源:互联网 发布:java编写一个日历程序 编辑:程序博客网 时间:2024/06/06 00:35

一、启动GDB的方式
gdb <program> 
eg:gdb bomb
lprogram也就是你的执行文件,一般在当前目录下
gdb <program> core
lgdb同时调试一个运行程序和core文件,core是程序非法执行后coredump后产生的文件
gdb <program> <PID>
l如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程IDgdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。  

二、GDB与VC++调试命令的对比


三、GDB常用命令
llist命令来打印程序的源代码。可以缩写为l ,点击回车键重复上面的命令
l执行gdb
gdb gdb_tst
l设置断点
通常至少要设一个断点,要不然gdb会直接运行到程序结束.
b main #在主函数入口设断点
l设置命令行参数
如果程序需要用到命令行参数,直接在gdb命令是无法输入
set args可指定运行时参数。
l如:gdb >setargs 1020 30 40 50
l开始调试
进入gdb提示符后,gdb并没有进调试状态
需要用r,run进行调试
删除断点:
info break
delete 1
l当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用stepnext命令单步跟踪程序。
continue[ignore-count]
    c [ignore-count]
   fg [ignore-count]
l       恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示忽略其后的断点次数。continuecfg三个命令都是一样的意思。
step <count>
l       单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。
next <count>
l       同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step
set step-mode
    set step-mode on
l       打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。 
set step-mod off
l       关闭step-mode模式。
finish
l       运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。相当于VCstep out
untilu
       当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

stepisi
   nextini
       单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepinexti可以单步执行机器指令。与之一样有相同功能的命令是display/i $pc,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码) 

       查看汇编代码  :
       set step-mode on
       display/i $pc         
       si          //单步执行
       修改寄存器内容:
      (gdb) set $eax = 0 
       ---- 通过set命令修改eax的值,与变量不同,修改寄存器的值时,需要在寄存器名称前加'$'


lGDB主要采用print来查看运行数据
print <expr> #显示表达式值
print /f #f表示格式,print/x按十六进制显示
printfx is %d\n,x  #格式化输出

lprint后接结构变量名,则可以把它所有成员打印出来
l查看数组
p*array@len #人为数组,查看内存中的连续对象
如果是静态数组,直接parray
lprint输出格式
x按十六进制格式显示变量。
d按十进制格式显示变量。
u按十六进制格式显示无符号整型。
o按八进制格式显示变量。
t按二进制格式显示变量。
a按十六进制格式显示变量。p/ai
c按字符格式显示变量。p/ci
f按浮点数格式显示变量print显示实例
print显示实例
l(gdb)pi
$21= 101
l(gdb)p/ai
$22= 0x65
l(gdb) p/ci
$23= 101 'e'
l(gdb)p/fi
$24= 1.41531145e-43
l(gdb) p/xi
$25= 0x65
l(gdb)p/ti
$26= 1100101
可以修改变量的值:
p x=5
可以调用函数
p fun(x)
查看内存 
l使用examine命令(简写是x)来查看内存地址中的值。
lx命令的语法如下所示
x/nfu是可选的参数
–s 查看字符串 (gdb) x/s 0x804a2cf
               0x804a2cf: "%d %d"

n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f表示显示的格式,跟print的格式参数相同
u表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4bytesu参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
n/f/u三个参数可以一起使用
x/3uh 0x54320表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。 
Watch:设置观察点
jump 15:跳转


1 0
原创粉丝点击