使用GDB调试汇编程序(简单)

直接调试目标程序的第一条命令,假如程序文件名是test01:

1
gdb ./test01

这样就进入了gdb程序。

第二步,先run一下:

命令很简单,就是run:

1
run

或者也可以简写成r:

1
r

如果不运行run直接打断点调试的话,会遇到下面的错误:

1
2
3
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x1190

原因在于数据断点的设置有误。在没有用gdb运行(run)过可执行程序之前,使用disasemble指令反汇编出来的汇编语言的左边的地址偏移地址,不是逻辑地址。所以,即使break指令能够设置断点,当GDB运行时也不可能访问到这个地址。也就会出现上面的错误。
数据断点:给某个内存地址设置断点,改变该地址所装内容时会触发断点,运行到该地址时会触发断点。(从网上看的,参考)
而学过操作系统或者微机原理就该知道,程序给出来的只是逻辑地址,不可能直接给物理地址的,物理地址都是由系统将其映射成了逻辑地址。

将格式改为intel格式:

1
set disassembly-flavor intel

反汇编main函数:

1
disas main

开始打断点调试:

比如输入disas main命令后看到了以下的内容:

1
2
3
4
5
6
7
8
9
(gdb) disas main
Dump of assembler code for function main:
0x56556190 <+0>: mov eax,ds:0x4008
0x56556195 <+5>: mov ebx,0x9b
0x5655619a <+10>: sub ebx,0xa
0x5655619d <+13>: add eax,ebx
0x5655619f <+15>: ret
End of assembler dump.

如果我要把断点打在<+5>的位置上,就输入以下命令:

1
break *0x56556195

程序将在运行完<+0>,还未运行<+5>的时候停下来。

该命令还可以简写成这样:

1
b *0x56556195

然后输入

1
run

开始调试

查看寄存器的值

比如查看eax的值:

1
info register eax

单步步进:

运行下面命令:

1
stepi

此时输入disas可以看到运行的位置:

1
2
3
4
5
6
7
8
(gdb) disas
Dump of assembler code for function main:
0x56556190 <+0>: mov eax,ds:0x56559008
=> 0x56556195 <+5>: mov ebx,0x9b
0x5655619a <+10>: sub ebx,0xa
0x5655619d <+13>: add eax,ebx
0x5655619f <+15>: ret
End of assembler dump.

继续运行:

运行下面命令:

1
continue