gpt4 book ai didi

linux - 无法在 GDB 中跨过 Thumb/ARM 转换,未设置 ARM 断点

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:38 27 4
gpt4 key购买 nike

我在 Android 1.6 模拟器上调试一个没有符号的程序。在加载 SO 库时发生崩溃(信号),我正在尝试追踪它。崩溃发生在库启动代码的某个地方,我知道的很多。在控制从加载程序转到 SO 之前,我知道 SO 加载程序代码中的一个安全位置。我可以在那里设置一个断点,然后一直到 BLX 进入库。加载程序的代码是 Thumb。库启动代码是ARM。

因为没有符号,我使用 set arm force-mode xxx 让 GDB 知道。在启动导致加载程序停止的序列之前,我将模式设置为 Thumb。

但问题是,当我到达 BLX 指令并尝试单步执行 (si) 时,调试器不会在下一个停止指令 - 它一直到信号。即使我在 BLX 上执行 si 之前执行了 set arm force-mode arm,这似乎也没有关系。

在库启动代码中设置断点也无济于事。我不确定 GDB 究竟是如何设置断点的,但看起来当前执行代码的模式与预期的断点目标模式之间的不匹配是一个障碍。

编辑:我什至尝试对运行代码进行猴子修补,以便在正确的位置使用 BKPT 命令 - GDB 仍然没有中断。

EDIT2:猴子修补代码部分似乎不起作用。不过,我可以将数据部分的一部分用作暂存区。不过,BKPT 不会导致 GDB 崩溃......


EDIT3:为三行代码片段使用临时数据区域,我可以切换出 Thumb 并在信号中返回 GDB。但是,现在我处于 ARM 模式,GDB 出于某种原因无法设置断点。

BLX 入库命令如下:blx r2。 r2 的值为 0x80601b60 - 这是库启动例程。

当我在 BLX 上停下来时,我会这样做。我在数据部分有一个草稿区。我将以下 ARM 命令放在那里:

mov r12, 0 ; the value of r12 will be soon ruined by the code anyway
ldr r12, [r12] ; Provoke a SIGSEGV to stop GDB in ARM mode
mov pc, r2 ; To resume back into the library

然后我强行将r2的值设置为我的scratch area,将GDB模式设置为ARM并继续。 scratch 区域中的 SIGSEGV 自然会被抛出。

我现在处于 ARM 模式(CPU 和 GDB 的强制模式)。我在 0x80601b60 - 库入口点设置了一个断点。我将 r2 的值改回 0x80601b60,以便第三条命令跳转到那里。我将 r12 的值更改为有效读取地址,以便在重试时不会重新抛出信号。然后我发出 signal 0 命令以在没有信号的情况下继续。

我预计控制会转到 0x80601b60 并且会命中断点。它不是。为什么不?分配给 pc 时 mov 语义是否有所不同(如 ldr rx, [pc] 是)?

mov pc, r2 上设置断点也不起作用。在按信号模式停止时在 GDB 中设置断点是否有问题?但是即使我在信号之前设置断点(在 Thumb 模式下)它也不起作用。

更奇怪的是,我遇到了这样的情况,当控制权通过 mov pc, r2 时,就好像它根本没有被执行一样。但是一旦我修复了 r12,之前的指令就会被执行。

信号 0 是否有单步模拟?

最佳答案

这是由 GDB 中的错误引起的。我现在正在准备修复。看 https://code.google.com/p/android/issues/detail?id=56962

[已编辑;最初,我链接到上面的错误 URL,正如我在下面的回复中所解释的那样。现在上面的 URL 是正确的。]

您可以选择我的 gerrit 提交,或者等待 Google 发布更新的 NDK。或者,如果您在 x86 上使用 Linux 或 Windows,我可能会共享一个二进制文件。

Gerrit 提交是:https://android-review.googlesource.com/#/c/61322/

关于linux - 无法在 GDB 中跨过 Thumb/ARM 转换,未设置 ARM 断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15166351/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com