在 adb 调试中跟踪多个函数的示例
以下示例显示如何在 adb 的控制下执行程序,并执行以下部分中描述的基本调试操作。
注: 本节中使用的示例程序 adbsamp3包含子函数调用的无限递归。 如果运行此程序来完成,那么将导致内存发生故障错误并退出。
此示例的源程序存储在名为 adbsamp3.c的文件中。 使用 cc 命令将此程序编译为名为 adbsamp3 的可执行文件:
cc adbsamp3.c -o adbsamp3启动 adb 程序
要启动会话并打开程序文件,请使用以下命令(不使用任何核心文件):
adb adbsamp3设置断点
首先,使用 :b 子命令在每个函数的开头设置断点:
.f:b
.g:b
.h:b显示一组指令
然后,显示 f 函数中前 5 个指令:
.f,5?ia
.f:
.f: mflr r0
.f+4: st r0, 0x8(r1)
.f+8: stu r1, -64(r1)
.f+c: st r3, 0x58(r1)
.f+10: st r4, 0x5c(r1)
.f+14:显示函数 g 中的 5 个指令,但不显示它们的地址:
.g,5?i
.g: mflr r0
st r0, 0x8(r1)
stu r1, -64(r1)
st r3, 0x58(r1)
st r4, 0x5c(r1)启动 adsamp3 程序
通过输入以下命令启动程序:
:r
adbsamp3: running
breakpoint .f: mflr r0adb 程序一直运行样本程序,直至它到达停止的第一个断点。
除去断点
由于运行程序至该点不导致任何错误,那么可除去第一个断点:
.f:d继续营销计划
使用 :c 子命令继续程序:
:c
adbsamp3: running
breakpoint .g: mflr r0adb 程序在下一个指令处重新启动 adbsamp3 程序。 程序操作继续,直至到达停止的下一个断点。
跟踪执行路径
通过输入以下内容跟踪执行路径:
显示变量值
显示fcnt输入以下命令的整数变量:
fcnt/D
fcnt:
fcnt: 1跳过断点
然后,通过输入以下内容运行程序并跳过前 10 个断点:
,10:c
adbsamp3: running
breakpoint .g: mflr r0adb 程序再次启动 adbsamp3 程序并显示正在运行的消息。 直至它正好遇到 10 个断点才停止程序。 要确保已经跳过这些断点,再次显示反向跟踪:
$c
.g(0,0) .f+2a
.f(2,11) .h+28
.h(10,f) .g+2a
.g(11,20) .f+2a
.f(2,f) .h+28
.h(e,d) .g+2a
.g(f,1c) .f+2a
.f(2,d) .h+28
.h(c,b) .g+2a
.g(d,18) .f+2a
.f(2,b) .h+28
.h(a,9) .g+2a
.g(b,14) .f+2a
.f(2,9) .h+28
.h(8,7) .g+2a
.g(9,10) .f+2a
.f(2,7) .h+28
.h(6,5) .g+2a
.g(7,c) .f+2ae
.f(2,5) .h+28
.h(4,3) .g+2a
.g(5,8) .f+2a
.f(2,3) .h+28
.h(2,1) .g+2a
.g(2,3) .f+2a
.f(1,1) .main+e
.main(0,0,0) start+fa