使用GDB进行调试
这是编译ARM二进制文件和使用GDB进行基本调试的简单介绍。在您按照教程进行操作时,您可能需要按照自己的习惯使用ARM程序集。在这种情况下,你要么需要一个备用的ARM设备,或者你只是按照在这短短的步骤建立自己的实验室环境中虚拟机操作方法。
您可以使用第7部分 - 堆栈和函数中的以下代码来熟悉GDB的基本调试。
.section .text .global _start _开始: 按{r11,lr} / *开始序幕。将帧指针和LR保存到堆栈* / 添加r11,sp,#0 / *设置堆栈框架的底部* / sub sp,sp,#16 / *序幕结束。在堆栈上分配一些缓冲区* / mov r0,#1 / *设置局部变量(a = 1)。这也可以作为设置最大功能的第一个参数* / mov r1,#2 / *设置局部变量(b = 2)。这也可以作为设置最大功能的第二个参数* / bl最大/ *呼叫/分支功能最大* / sub sp,r11,#0 / *结尾的开始。重新调整堆栈指针* / 流行{r11,pc} / *结语结尾。从堆栈中恢复帧指针,通过直接加载到PC,跳转到先前保存的LR * / 最大: 按{r11} / *开始序幕。将帧指针保存到堆栈* / 添加r11,sp,#0 / *设置堆栈框架的底部* / sub sp,sp,#12 / *序幕结束。在堆栈上分配一些缓冲区* / cmp r0,r1 / *执行if(a <b)* / movlt r0,r1 / *如果r0小于r1,将r1存入r0 * / 添加sp,r11,#0 / *结尾的开始。重新调整堆栈指针* / 弹出{r11} / *恢复帧指针* / bx lr / *结语结尾。通过LR寄存器跳回主站* /
就个人而言,我更喜欢使用GEF作为GDB扩展。它给了我一个更好的概述和有用的功能。您可以在这里试用:GEF - GDB增强功能。
将上面的代码保存在一个名为max.s的文件中,并使用以下命令进行编译:
$ as max.s -o max.o $ ld max.o -o max
调试器是一个强大的工具,可以:
- 崩溃后加载内存转储(验尸调试)
- 附加到正在运行的进程(用于服务器进程)
- 启动一个程序并进行调试
针对二进制文件,核心文件或进程ID启动GDB:
- 附加到进程:$ gdb -pid $(pidof <process>)
- 调试一个二进制文件:$ gdb ./file
- 检查核心(崩溃)文件:$ gdb -c ./core.3243
$ gdb max
如果您安装了GEF,则会释放您的gef>提示符。
这是你如何获得帮助:
- (gdb)h
- (gdb