之前有总结过windbg调试,是针对windows开发而言,现在项目涉及Linux平台,为了更好的查看到内核函数的调用、系统调用以及寄存器存放内容,特意借助gdb进行linux下的代码调试。使用起来也是得心应手。
1、首先编写一个简单的C程序test.c。
2、在命令行编译该程序:$ gcc -g -o test test.c。可以发现这里有一个不同之处就是添加了-g参数,该参数将C程序编译成可使用gdb调试的可执行版本。
3、编译成功后,用gdb运行生成的test文件:$ gdb test。自此进入gdb操作界面。
4、首先设置显示格式:gdb > display /i $pc。display在进行单步调试时自动显示变量内容,$pc是GDB的环境变量,表示指令的地址,/i则表示输出格式为机器指令码,也就是汇编。
5、之后是设置函数断点:gdb > break func 。当程序执行到func函数处暂停,此时可以根据自己的需要选择单步调试。
6、单步调试: gdb > stepi 。此时gdb会相应的显示函数调用的系统调用,比如syscall。
7、查看寄存器的值: gdb > info registers 。我们会发现当前系统下各寄存器的内容,以Linux 64位系统为例,从syscall处进入,rax内存放系统调用号,rdi存放函数第一个参数,rsi存放函数第二个参数,rdx存放函数第三个参数。
8、有时候你也需要查看某内存地址的内容,此时会用到x指令:gdb > x/nfu,其中n指示显示数目,默认为1,n=20显示该地址处后20个地址的内容,f指定内容格式,i为整数,s为字符串,u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
基本执行到第8步便可查询到所需内容,我只是刚开始接触gdb,希望在之后的学习实践中,有更多的积累。