在 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  r0

adb 程序一直运行样本程序,直至它到达停止的第一个断点。

除去断点

由于运行程序至该点不导致任何错误,那么可除去第一个断点:

.f:d

继续营销计划

使用 :c 子命令继续程序:

:c
adbsamp3: running
breakpoint   .g:       mflr  r0

adb 程序在下一个指令处重新启动 adbsamp3 程序。 程序操作继续,直至到达停止的下一个断点。

跟踪执行路径

通过输入以下内容跟踪执行路径:

显示变量值

显示fcnt输入以下命令的整数变量:

fcnt/D
fcnt:
fcnt:     1

跳过断点

然后,通过输入以下内容运行程序并跳过前 10 个断点:

,10:c
adbsamp3: running
breakpoint   .g:       mflr  r0

adb 程序再次启动 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