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

All*_*uer 32 delphi xcode ios lldb

我需要在实际设备上调试ios应用程序的启动...并且通过启动我的意思是当操作系统控制应用程序时执行的第一条指令.不是"主要".此外,此应用程序没有任何符号(即调试信息不​​可用..).我不在乎是否必须在CPU指令级调试.我知道该怎么做(已经做了30多年).我希望调试器在控件即将传输到应用程序时停止.当我使用Attach | by Name命令运行时,它只是说"完成运行".

哦,这个应用程序不是在XCode中构建的.然而,它我构建,签名和配置并移动到设备的应用程序.应用程序运行,因为我可以看到控制台输出.万一你以为我是一个黑客试图调试别人的应用程序.

这对于一个高级订单怎么样?我敢打赌,没有人可以回答这个问题......我无法找到任何有关如何使用XCode构建的项目执行此操作的信息.我想知道苹果霸主是否根本不可能或"允许"它?

你怎么说,Stack Overflow众神?

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

All*_*uer 23

我将回答我自己的问题,因为我认为我偶然发现了一个解决方案.如果有人比这更优雅和简单,请回答.到了步骤:

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

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

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

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

  • 这是一个温和的主题,但它与您使用GDB代替LLDB的观点有关.在模拟器上使用LLDB并调试应用程序时,"模块视图"完全空白.如果你想用你的应用程序找出内存中的系统dylib,你就不能!?解决方法是将项目配置为使用GDB,但是更改项目配置会导致Xcode发出新警告. (2认同)

Ken*_*ner 2

您的问题没有意义 - main 是应用程序的入口点。这是应该遇到的第一个代码,除非您可能为某些类覆盖了initialize()(但即使如此,我认为 main 也会在运行时之前被命中)。

我认为您在启动时看到某种奇怪的错误,并且您认为您想在入口处设置一个断点来捕获它,但更可能对您有帮助的是在启动时描述问题,并让 4000 人中的一个已经看到并修复了相同的崩溃,可以帮助您...

但是,如果您确实想使用 GDB 来中断没有符号的应用程序(但从 XCode 启动),您可以按照以下方式让 GDB 在程序集地址上中断:

如何在 gdb 中给定地址处的汇编指令上中断?

要查找 main (或其他方法)的地址,您可以使用工具或 atos,此问题中的一些示例:

将 iOS 崩溃转储中的偏移量与反汇编的二进制文件相匹配

添加:

如果由于某种原因 XCode 无法启动您的应用程序进行调试,您还可以越狱并在设备本身上安装 GDB,这将完全控制调试。如果 XCode 可以启动你的应用程序,我认为没有理由能够在任意内存地址处中断不能为你提供你所寻求的能力......

  • 呃..“main”*不是*实际的入口点。它是从包含入口点的实际“启动”代码中调用的。 (16认同)
  • 我认为该应用程序是由某些工具生成的整个机器代码字节(在本例中为 ARM v7)。因此,“将控制权转移到应用程序”意味着“一旦 CPU 跨越边界(通过 BL 或 BLX 指令)从操作系统到由 mach-o 可执行二进制文件定义的应用程序的第一条指令”。 (7认同)
  • @Kendall,看看艾伦的个人资料,特别是他的简历和他的博客的链接。他有他的理由(顺便说一句,这真的不重要——无论你是否理解为什么要问这个问题,这个问题都是有效的:-))。 (7认同)
  • 谢谢,肯;-)。我故意对“原因”含糊其辞,是的。然而,我试图在最基本的层面上明确我的要求。我清楚地知道,对于那些不从事“创建”编程工具(编译器、调试器、IDE 等)业务的人来说,他们并没有真正考虑过从无到有的痛苦。大多数人只是理所当然地认为编程工具“就在那里”。 (5认同)