使用GDB调试汇编程序(简单)
直接调试目标程序的第一条命令,假如程序文件名是test01:
1 | gdb ./test01 |
这样就进入了gdb程序。
第二步,先run一下:
命令很简单,就是run:
1 | run |
或者也可以简写成r:
1 | r |
如果不运行run直接打断点调试的话,会遇到下面的错误:
1 | Warning: |
原因在于数据断点的设置有误。在没有用gdb运行(run)过可执行程序之前,使用disasemble指令反汇编出来的汇编语言的左边的地址偏移地址,不是逻辑地址。所以,即使break指令能够设置断点,当GDB运行时也不可能访问到这个地址。也就会出现上面的错误。
数据断点:给某个内存地址设置断点,改变该地址所装内容时会触发断点,运行到该地址时会触发断点。(从网上看的,参考)
而学过操作系统或者微机原理就该知道,程序给出来的只是逻辑地址,不可能直接给物理地址的,物理地址都是由系统将其映射成了逻辑地址。
将格式改为intel格式:
1 | set disassembly-flavor intel |
反汇编main函数:
1 | disas main |
开始打断点调试:
比如输入disas main
命令后看到了以下的内容:
1 | (gdb) disas main |
如果我要把断点打在<+5>的位置上,就输入以下命令:
1 | break *0x56556195 |
程序将在运行完<+0>,还未运行<+5>的时候停下来。
该命令还可以简写成这样:
1 | b *0x56556195 |
然后输入
1 | run |
开始调试
查看寄存器的值
比如查看eax的值:
1 | info register eax |
单步步进:
运行下面命令:
1 | stepi |
此时输入disas
可以看到运行的位置:
1 | (gdb) disas |
继续运行:
运行下面命令:
1 | continue |