gdb调试手记

gdb调试手记

记录一些gdb的使用经验

假装现在要调试的二进制程序叫a.exe,源文件叫pleaseDebugMe.c

0x00 打开文件

直接输入gdb a.exe或者打开gdb之后输入file a.exe

0x01 如何下断点

首先用gcc/g++编译C/C++程序时一定要加上-g选项,which means 加上调试信息,就像gcc -g pleaseDebugMe.c

然后用gdb加载之,添加了调试信息之后就很爽了,一般情况下对照源文件直接按照行数下断点就ok。比如要断在源文件中的45行,直接在gdb中b 45即可。

如果拿到的程序没有调试信息也没有关系,比如现在拿到的二进制文件a.exe是没有调试信息的。那么可以直接先info functions,查看自己想调的函数叫什么,这里直接以main函数为例好了,可以直接b main断在main函数的开头。如果需要精确地断在某处,请输入disas main直接查看汇编,大致看一下自己要断的汇编语句的地址,比如地址在0x00401410,那么就输入b *0x00401410,这样就成功下了断点了。

如果要查看断点情况,就info b即可,删除某个断点如断点2就直接delete 2,删除所有断点就delete breakpoints

info命令很强大,可以info很多东西,除了前面提到的info b / info functions之外,我常用的还有:

  • info stack 简化 info s
  • info frame/frame 1 简化 info f/f 1
  • info registers 简化 info reg
  • info variable 简化 info var

0x02 开始调试

现在假设a.exe是个简单递归程序。

假设现在在a.exe下了个断点,相当于pleaseDebugMe.c的45行。输入r(run),程序就跑起来了,直到遇到断点。现在比如我想看第三次递归的情况,我就直接输入多次c(continue),每次输入c程序都会运行到断点后停下来。

来到了想调试的代码附近之后,就可以开始慢慢调试了。

  • s Step into
  • n Step over
  • p var Print variable
  • 以上三个命令依赖于Symbol Table,如果编译时没加-g选项就用不了。s和n都是源代码级的调试,一次一行。如果用不了就用下面两个,下面两个是汇编级别的单步。
  • si
  • ni

调试过程中注意之前提到的命令们

  • p可以打印变量的值
  • info reg可以查看寄存器中的值
  • info f / f 1 / f 2可以查看相应栈帧的信息,也可以用frame / frame 1 / frame 2来查看,只不过后者显示出的信息更简略
  • info b 查看断点
  • info s查看当前栈
  • x/40w $esp查看栈顶以下160(40*4)字节的情况

待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值