GDB
来源:互联网 发布:java编写一个日历程序 编辑:程序博客网 时间:2024/06/06 00:35
一、启动GDB的方式
–gdb <program>
eg:gdb bomb
lprogram也就是你的执行文件,一般在当前目录下
–gdb <program> core
l用gdb同时调试一个运行程序和core文件,core是程序非法执行后coredump后产生的文件
–gdb <program> <PID>
l如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动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命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。
–continue[ignore-count]
c [ignore-count]
fg [ignore-count]
c [ignore-count]
fg [ignore-count]
l 恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示忽略其后的断点次数。continue,c,fg三个命令都是一样的意思。
–step <count>
l 单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。
–next <count>
l 同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step
–set step-mode
set step-mode on
set step-mode on
l 打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。
–set step-mod off
l 关闭step-mode模式。
–finish
l 运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。相当于VC的step out
–until或u
当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
–stepi或si
nexti或ni
单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是“display/i $pc”,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)
nexti或ni
单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是“display/i $pc”,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)
查看汇编代码 :
set step-mode on
display/i $pc
si //单步执行
修改寄存器内容:
(gdb) set $eax = 0
---- 通过set命令修改eax的值,与变量不同,修改寄存器的值时,需要在寄存器名称前加'$'
set step-mode on
display/i $pc
si //单步执行
修改寄存器内容:
(gdb) set $eax = 0
---- 通过set命令修改eax的值,与变量不同,修改寄存器的值时,需要在寄存器名称前加'$'
lGDB主要采用print来查看运行数据
–print <expr> #显示表达式值
–print /f #f表示格式,如print/x按十六进制显示
–printf“x 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/n、f、u是可选的参数
–s 查看字符串 (gdb) x/s 0x804a2cf
0x804a2cf: "%d %d"
0x804a2cf: "%d %d"
–n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
–f表示显示的格式,跟print的格式参数相同
–u表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
–n/f/u三个参数可以一起使用
x/3uh 0x54320表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。 Watch:设置观察点
jump 15:跳转
1 0
- GDB
- gdb
- GDB
- GDB
- gdb
- GDB
- Gdb
- GDB
- gdb
- gdb
- GDB
- GDB
- gdb
- gdb
- gdb
- GDB
- gdb~~
- gdb
- 地方网站赚钱超容易!学会这个就行了
- 水水笔-first(04/29)
- tomcat警告解决办法:WARNING: An attempt was made to authenticate the locked user
- CentOS 7 yum install mysql
- web网站中实现文档的下载
- GDB
- iOS开发-项目的完整重命名方法,图文教程。
- 从一个div向另一个div里面追加自己的元素
- 触屏拉动页面
- Android代码混淆及项目发布步骤记录
- 使用CD-K算法实现RBM
- Linux下创建库函数
- Leetcode 139. Word Break & 140. Word Break II
- 【设计模式】正确使用单例模式