gpt4 book ai didi

ios - 我怎样才能陷入调试器并在 iOS 硬件上继续?

转载 作者:可可西里 更新时间:2023-11-01 03:53:28 24 4
gpt4 key购买 nike

在 Mac OS X 和 iOS 模拟器(均为 x86)中,我们可以使用内联汇编中的 int3 指令陷入调试器 (LLDB)。这很好,因为它会陷入特定的代码行,但我们可以通过在调试器中点击继续来立即继续。

有没有办法在 iOS 硬件上执行此操作?

An answer to an older question提到 raise(SIGINT) 据我所知(通过检查 signal.h)不存在。另一个答案提到了 trap 汇编指令,它会导致构建错误(“无法识别的指令助记符”)。同样无法识别的还有 BKPT 汇编指令 mentioned in ARM documentation .

我已经尝试了 __builtin_trap(),它几乎可以满足我的要求,但不允许我继续。我一直点击它,除非我使用 jump +1register write pc `$pc+8\` 手动推进指令指针,这比点击继续方便得多.

我正在使用 Xcode 7.3.1 为 32 位和 64 位设备构建 iOS 9。感谢您的帮助!

最佳答案

Apple 的 libc signal.h包括 XNU 的 sys/signal.h ,它确实定义了 SIGINT(在所有平台上):

// [...]

#define SIGHUP 1 /* hangup */
#define SIGINT 2 /* interrupt */
#define SIGQUIT 3 /* quit */
// [...]

因此,虽然我无法确认这种做法是否确实有效(因为我没有 iOS 9 设备),但阻碍您前进的障碍实际上应该不是问题。

至于汇编指令,BKPT 是一个有效的 ARM 指令,尽管只适用于 A32。 A64 变体称为 BRK .
如果您正在构建胖二进制文件并无条件地使用其中任何一个,您将始终遇到编译器错误。

另请注意,这两条指令都需要一个立即值(传递给调试器)。省略该值也会产生编译器错误。

也就是说,您应该能够使用简单的 #ifdef 为 A32 和 A64 插入调试指令:

#ifdef __aarch64__
asm volatile("BRK 0");
#else
asm volatile("BKPT 0");
#endif

您可以将 0 替换为您在 0255 之间选择的任何值。

关于 TRAP 指令的说明:虽然 Apple 的汇编程序似乎接受了 A32 的这条指令并将其翻译成 0xe7ffdefe,但它会发出“无法识别的指令助记符” A64,类似于BKPT指令。
我也无法在 ARM 信息中心或 Apple 的文档中找到对说明的任何引用。

关于ios - 我怎样才能陷入调试器并在 iOS 硬件上继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37736320/

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