我可以调试从IPA存档安装的iOS应用吗?

Yev*_*y P 9 debugging xcode ad-hoc-distribution ios ipa

我的应用程序有一些问题,只有当我安装它时才会重现,但如果我只是从Xcode运行应用程序,则不会重现.我想调试这个问题,但到目前为止我没有任何运气.我正在使用Xcode 5.1.1.这是我做的:

1)转到Product-> Scheme-> Edit Scheme-> Archive并将构建配置设置为Debug.

2)代码签名身份设置为iPhone Developer.

3)生成调试符号设置为是.

4)转到Product-> Archive,归档后,单击"Distribute",然后选择"Save for Enterprise或Ad Hoc Deployment".

5)选择了我的开发配置文件.

6)单击"导出"并导出.ipa文件.

7)使用iPhone配置实用程序将应用程序安装到设备上.

8)在设备上运行应用程序.

9)在Xcode中,转到Debug-> Attach To Process->通过PID或Name,输入应用程序名称.Xcode成功附加并表示在iPad上运行应用程序.

10)然而,当我在我的应用程序中执行某些操作时,我无法点击应该被击中的任何断点(如果我从Xcode安装并运行应用程序,则所有断点都被命中).

我错过了什么吗?

Jim*_*ham 7

此时您还没有针对该应用程序的任何调试信息,并且由于大多数应用程序都被彻底剥离,因此lldb甚至不会挂起符号.所以我们无法成功设置断点.

当您构建应用程序时,Xcode生成了一个dSYM文件(MyApp.app.dSYM),其中包含调试信息,因此所有文件都不会丢失.问题是当你在设备上附加一些 - Xcode - 随机应用程序时,Xcode无法知道在哪里可以找到它的调试信息.

您可以使用以下命令将调试信息添加到lldb中的调试会话中:

(lldb) add-dsym <PathTo.dSYM>
Run Code Online (Sandbox Code Playgroud)

附加后必须这样做.

lldb还使用SpotLight来查找dSYM,所以如果你将dSYM放在SpotLight知道要搜索的地方(比如桌面或用户目录下的文件夹),那么lldb应该自动选择它.

您可以通过执行以下操作来判断lldb是否已成功读取dSYM:

(lldb) image list <AppName>
Run Code Online (Sandbox Code Playgroud)

如果lldb找到dSYM,它会在列出AppName二进制文件的路径后在单独的行中列出它的路径.


Yev*_*y P 6

吉姆英厄姆,谢谢你的回答.

我找到了无法调试静态库的原因.在每个Xcode项目中,"部署"部分下都有一个名为"剥离链接产品"的设置.在我的所有项目中,此设置都设置为"是".

为了调试存档构建的应用程序的静态库,我在每个依赖库项目(以及主项目)中将此设置设置为"否".对于调试/释放模式,也可以设置不同.在此之后,我看到归档期间构建的库符号,并且能够调试到库代码中.我希望这可以帮助别人.

不幸的是(或者幸运的是)我试图调试的错误在图书馆符号未被剥离时不再重现.当符号被剥离时可能会发生某些事情,我需要进一步调查.


小智 5

我正在努力解决同样的问题,只是从Xcode启动我的应用程序不是一个选项 - 我必须构建IPA,在iOS设备上加载它,然后调试.最终我能够通过以下步骤完成这项工作:

1)将方案归档目标设置为Debug

2)更改Debug版本的以下设置

  • 保留私有外部符号(KEEP_PRIVATE_EXTERNS):是
  • 启用Bitcode(ENABLE_BITCODE):否
  • 剥离链接产品(STRIP_INSTALLED_PRODUCT):没有

3)将生成的IPA文件重建,存档并部署到iOS设备.

4)启动应用程序,在Xcode中,选择Debug/Attach to Process/YourAppName(id)

5)进入调试器 - 您应该能够看到代码,放置和使用断点等.

如果你想从一开始就调试你的代码,只需要一个休眠一两秒的循环,然后检查主函数顶部的一个标志 - 当你进入调试器时,只需更改标志就可以了逃离循环.