gdb调试手记

2016-12-03 08:18:46来源:CSDN作者:caterpillarous人点击

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)字节的情况

待续

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台