Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在没有符号的设备上调试iOS应用程序_Ios_Xcode_Delphi_Lldb - Fatal编程技术网

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

在没有符号的设备上调试iOS应用程序,ios,xcode,delphi,lldb,Ios,Xcode,Delphi,Lldb,我需要在实际设备上调试ios应用程序的启动。。。我所说的启动是指操作系统将控制权移交给应用程序时执行的第一条指令。不是“主要”。此外,此应用程序没有任何符号(即调试信息尚不可用)。我不在乎是否必须在CPU指令级进行调试。我知道怎么做(做了30多年)。我希望调试器在控件即将转移到应用程序时停止。当我使用Attach | by Name命令并运行时,它只显示“Finished running” 哦,这个应用程序不是用XCode构建的。然而,它是我构建、签名、配置并移动到设备上的应用程序。应用程序确实

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

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

这么高的要求怎么样?我敢打赌没有人能回答这个问题。。。我找不到任何关于如何使用XCode构建的项目实现这一点的信息。我想知道这是不可能的还是苹果的霸主们“允许”的

你说呢,诸神


更新:我应该澄清一些事情。此应用程序不是使用任何商用或开源工具构建的。我与一家工具供应商合作创建编译器、框架和IDE。瞧,你拿不到这个工具。。。然而在引导一个新的工具链的过程中,人们必须经常求助于一些非常低级的原始调试。尤其是当工具生成的代码中有bug时。

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

我认为您在启动时看到了某种奇怪的错误,您认为您希望在条目上设置一个断点来捕获它,但更有可能帮助您的是描述启动时的问题,并让4000名看到并修复了相同崩溃的人员中的一人帮助您

但是,如果您确实希望在没有符号的应用程序(但从XCode启动)上使用GDB中断,则可以在程序集地址上使用GDB中断,如下所示:

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

补充:


如果由于某种原因,XCode无法启动应用程序进行调试,您还可以越狱并在设备本身上安装GDB,从而完全控制调试。如果XCode可以启动您的应用程序,我看不出为什么能够在任意内存地址中断并不能提供您所寻求的功能…

使用WebView的应用程序的一个解决方案是在iOS模拟器中运行它们,并使用macOS Safari中的远程调试器连接到该模拟器。这是一个离题的话题,但也许其中一个可以从中受益


或者在iOS上使用NetCat。。。不是最完美的解决方案,但至少你看到了发生了什么。

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

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

  • 创建一个名为空Xcode的新项目。在设备上构建并运行它
  • 找到输出捆绑包的.app文件夹
  • 将上述原始iOS可执行文件复制到.app bundle文件夹中的现有文件上
  • 应用程序现在将具有无效签名,无法部署和运行
  • 对应用程序包运行codesign(您可以通过在上面的Xcode项目上运行xcodebuild找到命令行)
  • 在bundle的.app文件夹中,对二进制图像运行otool-h-l。找到LC_UNIXTHREAD load命令并找到与“pc”寄存器关联的值。这是os加载程序将跳转到应用程序的地址。如果这个地址是奇数,那么这些是拇指指令,否则它将是ARM(我想这就是它的工作原理)
  • 添加一个符号断点(我使用GDB而不是LLDB),并输入地址“*0x0000124”作为符号
  • 选择产品|执行操作|运行而不构建
  • 假设GDB能够计算断点表达式并设置断点,并且您选择了产品|调试工作流|调试时显示反汇编,则流程应该在应用程序中执行的第一条指令处中断


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

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