关于GDB调试C程序的常用命令与手段就不多说了,这里主要介绍一下如何对C程序做到汇编指令级别的调试。
首先是获取汇编代码,这可以通过disassemble命令或x命令或类似的命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | [root@localhost test]# gdb ./a.out -q |
接着,利用display命令自动显示当前正要执行的汇编指令,display命令可以在每次程序暂停时自动打印指定变量的值。而我们要显示的汇编指令在ip寄存器内(当然,ip寄存器内存储的是机器码),我们可以看看(先得把程序执行起来):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | (gdb) b main |
看汇编指令:
1 2 3 4 5 | (gdb) p $rip |
我们还可以利用一个名为pc的gdb内部变量:
1 2 3 4 5 | (gdb) p $pc |
结合display命令和寄存器或pc内部变量,我们做如下设置:
1 2 3 4 | (gdb) display /i $pc |
或同时显示多条汇编,比如3条:
1 2 3 4 5 6 7 8 9 10 11 12 13 | (gdb) display /3i $pc |
接下来,利用ni(nexti)或si(stepi)命令进行汇编指令级的调试,如下所示可以看到参数是如何传递的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | (gdb) display /i $pc |
更简单直接的方法是利用layout显示汇编代码窗口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | (gdb) help layout |
如果是7.0版本以上的gdb,那么还有一个方法显示汇编:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
另外,7.0版本以上gdb的disas命令可以携带/m参数,让汇编与c源码同时显示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|