gpt4 book ai didi

ios - 在没有符号的设备上调试 iOS 应用程序

转载 作者:IT王子 更新时间:2023-10-29 07:46:41 25 4
gpt4 key购买 nike

我需要在实际设备上调试 ios 应用程序的启动...我所说的启动是指当操作系统将控制权交给应用程序时执行的第一条指令 .不是“主要”。此外,此应用程序没有任何符号(即调试信息不​​可用..)。我不在乎是否必须在 CPU 指令级别进行调试。我知道该怎么做(做了 30 多年)。我希望调试器在控制即将转移到应用程序时停止。当我使用 Attach|by Name 命令并运行时,它只显示“已完成运行”。

哦,这个应用程序不是用 XCode 构建的。它,但是我构建、签名和配置并移动到设备的应用程序。该应用程序确实运行了,因为我可以看到控制台输出。以防万一你认为我是一些试图调试某人应用程序的黑客。

这是一项艰巨的任务吗?我敢打赌没有人能回答这个问题……我一直无法找到任何关于如何使用 XCode 构建的项目来做到这一点的信息。我想知道苹果霸主是否根本不可能或“允许”?

Stack Overflow 大神们怎么说?

更新:我应该澄清一些事情。此应用程序不是使用任何商用或开源工具构建的。我与一家创建编译器、框架和 IDE 的工具供应商合作。 IOW,你不能得到这个工具......但是。在启动一个新工具链的过程中,人们必须经常求助于一些非常低级的原始调试。特别是如果工具生成的代码中存在错误。

最佳答案

我要回答我自己的问题,因为我认为我偶然发现了一个解决方案。如果有人有比这更优雅和简单的东西,请一并回答。进入步骤:

从原始的单一 iOS 可执行文件开始(不是捆绑的 .app,而是作为机器代码的实际二进制 mach-o 文件)。

  1. 创建一个新的同名空 Xcode 项目。在设备上构建并运行它。
  2. 找到输出包的 .app 文件夹。
  3. 将上述原始 iOS 可执行文件复制到 .app 包文件夹中的现有文件上。
  4. 应用程序现在将具有无效签名,无法部署和运行。
  5. 针对应用程序包运行代码设计(您可以通过在上述 Xcode 项目上运行 xcodebuild 来找到命令行)。
  6. 在 bundle 的 .app 文件夹中,对二进制镜像运行 otool -h -l。找到 LC_UNIXTHREAD 加载命令并找到与“pc”寄存器关联的值。这是操作系统加载程序将跳转到您的应用程序的地址。如果这个地址是奇数,那么这些是 Thumb 指令,否则它将是 ARM(我认为这就是它的工作原理)。
  7. 添加一个符号断点(我使用 GDB 而不是 LLDB)并将地址输入为 '*0x00001234' 作为符号。
  8. 选择产品|执行操作|无需构建即可运行。

假设 GDB 能够评估断点表达式并设置断点,并且您选择了产品|调试工作流|调试时显示反汇编,那么该过程应该在应用程序中执行的第一条指令处中断。

您现在可以单步执行指令并使用 GDB 控制台获取/设置寄存器值。

关于ios - 在没有符号的设备上调试 iOS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777244/

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