English 中文(简体)
无符号设备上的调试 iOS 应用程序
原标题:Debug iOS application on device without symbols

我需要调试一个 ios 应用程序在实际设备上的启动程序... 。 启动时, 我的意思是 OS 将控件转到应用程序时执行的 < em> 第一次指令 < / em > 。 不是“ main ” 。 另外, 此应用程序没有任何符号( 即调试信息不可用. ) 。 我不管是否必须在 CPU 指令级别调试。 我知道如何这样做( 超过 30 年)。 我希望调试器在控制即将传输到应用程序时能够 < em> stop < / em > 。 当我使用 Acta {by name 命令并运行时, 它只会说“ 完成运行 ” 。

哦, 这个应用程序 < em > 并非在 XCode 中构建 。 它 is , 然而一个应用程序是我建造、 签名、 提供并移动到设备上 。 应用程序运行时, 我可以看到控制台输出 。 以防万一您认为我是个黑客, 试图调试某人的应用程序 。

我打赌没人能回答这个...

你说呢, 堆积溢出神?

更新: 我应该澄清一件事。 此应用程序是 < em> not , 由任何商业可用或开放源码工具创建的。 我与一个工具供应商合作, 创建编译器、 框架和 IDEs 。 IOW, 您无法获得这个工具... 。 在启动新工具链的过程中, 需要经常使用一些非常低的原始除错程序 。 特别是如果该工具生成的代码中有错误 。

问题回答

我要回答我自己的问题,因为我想我遇到了一个解决办法。如果有人有比这更优雅和简单的东西,请也回答。

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

  1. Create a new like-named empty Xcode project. Build and run it on the device.
  2. Locate the output bundle s .app folder.
  3. Copy the above raw iOS executable over the existing one in the .app bundle s folder.
  4. The application will now have an invalid signature and cannot be deployed and run.
  5. Run codesign against the app bundle (you can find out the command-line by running xcodebuild on the above Xcode project).
  6. In the bundle s .app folder, run otool -h -l on the binary image. Locate the LC_UNIXTHREAD load command and find the value associated with the pc register. This is address where the os loader will jump to your application. If this address is odd, then these are Thumb instructions otherwise it will be ARM (I think that s how it works).
  7. Add a symbolic breakpoint (I used GDB instead of LLDB) and enter the address as *0x00001234 as the symbol.
  8. Select Product|Perform Action|Run Without Building.

假设 GDB 能够评价断点表达式并设置断点, 并且您选中了 PRODUCT {Dubble Workingflow}}}*Sshow 拆卸当调试时, 此进程应该在应用程序中执行的第一个指令处中断 。

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

您的问题没有意义 - 主要是应用程序的切入点。 这是第一个应该遇到的代码, 除非您可能已经初始化( ) 超过某些班级( 但即便如此, 我认为主在运行前也会被击中 ) 。

我想你在发射时看到某种奇怪的错误, 并且你认为你想在进入时设置一个中断点来抓它, 但更有可能的帮助是描述发射时的问题, 让4000名已经看到并固定了同样的坠机的人之一来帮助你。 。 。 。

但是,如果您真的想要使用 GDB 来断开一个没有符号的应用程序( 但是您可以从 XCode 中发射), 您可以在组装地址上按以下方式使用 GDB 断开 :

< a href=" "https://stackoverflow.com/ questions/5459581/how-to-break-on-assembly- in-gdb" 如何在 gdb 中某个特定地址中断组装指令?

要找到您可以使用工具或阿托斯的主要地址(或其他方法),请在此问题上举一些例子:

< a href=" "https://stackoverflow.com/ questions/10578155/matching-up-offeets- in-ios-crash-dump-to-dismalled-binary" > 将iOS 崩溃倾弃的补丁匹配到拆分的二进制

补充:

如果由于某种原因 XCode 无法启动您的调试应用程序, 您也可以在设备上安装 GDB, 从而完全控制调试 。 如果 XCode 可以启动您的调试 。 我看不出为什么可以任意破解存储地址, 却无法提供您所寻求的能力 。

网络视图应用的一个解决方案就是在 iOS 模拟器中运行它们,并将它与 macOS Safari 的远程开关器连接起来。 这是离专题的,但其中之一可能会受益。

http://hiediutley.com/2011/11/22/debugging-ios-apps-using-safari-web-inspector/

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





相关问题
determining the character set to use

my delphi 2009 app has a basic translation system that uses GNUGetText. i had used some win API calls to prepare the fonts. i thought it was working correctly until recently when someone from Malta ...

Help with strange Delphi 5 IDE problems

Ok, I m going nuts here. For the last (almost) four years, I ve been putting up with some extremely bad behavior from my Delphi 5 IDE. Problems include: Seemingly random errors in coride50.bpl ...

How to write a Remote DataModule to run on a linux server?

i would like to know if there are any solution to do this. Does anyone? The big picture: I want to access data over the web, using my delphi thin clients. But i´would like to keep my server/service ...

How convert string to integer in Oxygene

In Delphi, there is a function StrToInt() that converts a string to an integer value; there is also IntToStr(), which does the reverse. These functions doesn t appear to be part of Oxygene, and I can ...

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...