【问题标题】:Can I debug iOS app installed from IPA archive?我可以调试从 IPA 存档安装的 iOS 应用程序吗?
【发布时间】:2015-01-07 18:55:10
【问题描述】:

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

1) 转到产品->方案->编辑方案->存档并设置构建 配置到 Debug。

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

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

4) 转到产品->存档,存档后,单击 “分发”,然后选择“保存以供企业或临时部署”。

5) 我的开发配置文件被选中。

6) 点击“导出”,导出 .ipa 文件。

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

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

9) 在 Xcode 中,进入 Debug->Attach To Process->By PID or Name,输入 应用名称。 Xcode 附加成功并说正在运行应用程序 iPad。

10) 但是,我不能打任何断点,当我 在我的应用程序中执行某些操作(如果我从 Xcode 安装并运行该应用程序 而是命中所有断点)。

我错过了什么吗?

【问题讨论】:

    标签: ios xcode debugging ipa ad-hoc-distribution


    【解决方案1】:

    此时您没有任何应用程序的调试信息,而且由于大多数应用程序都被彻底剥离,因此甚至没有符号可供 lldb 挂钩。所以我们将无法成功设置断点。

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

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

    (lldb) add-dsym <PathTo.dSYM>
    

    您必须在附加后执行此操作。

    lldb 还使用 SpotLight 来查找 dSYM,因此如果您将 dSYM 放在 SpotLight 知道要搜索的某个位置(例如您的桌面或用户目录下的文件夹),那么 lldb 应该会自动选择它。

    您可以通过以下方式判断 lldb 是否已成功读取 dSYM:

    (lldb) image list <AppName>
    

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

    【讨论】:

    • 感谢您的回复。我应该使用作为归档过程的一部分构建的 .dSYM 文件(在 .xcarchive 目录内)还是单独构建的文件?我尝试使用 .xcarchive 中的那个并按照上述步骤操作,但仍然无法命中任何断点,即使“图像列表”命令显示列出的 dSYM 文件也是如此。但是,如果我尝试使用单独构建的 dSYM,在尝试 add-dsym 时会出现“UUID 不匹配错误”。您还有什么建议吗?
    • 您应该使用存档中的那个。您可以尝试在关闭优化的情况下以及使用开发配置文件构建应用程序,看看是否可以修复设置断点。优化可以使代码以意想不到的方式(除了优化器之外的任何人)表现。如果这不起作用,最好向 Apple 提交错误。
    • 我想我知道问题出在哪里。我的应用程序与静态库链接。我需要的断点实际上在静态库代码中。问题是归档期间生成的 dSYM 文件不包含来自我的静态库的任何符号,仅包含来自应用程序本身的符号。另一方面,如果我从 Xcode 构建而不是归档,则生成的 dSYM 包含所有符号,但由于 UUID 不匹配错误,我无法使用该 dSYM。我需要弄清楚如何让它在归档期间包含静态库符号。
    • 我找到了以下调试方法:在创建的存档文件夹中,将 dSYM 和 myapp.app 替换为常规 Xcode 构建中的。之后按照与之前相同的步骤创建 .ipa。然后我可以在设备上安装 ipa,运行并附加到它,并且实际上可以达到我的断点。请注意,仅替换存档中的 dSYM 对我不起作用,我也必须替换 myapp.app。所以没关系,我可以调试它,但是现在我替换了.app,我想调试的原始错误不再重现。不知何故,这 2 .app 是不同的......
    • @JimIngham 您说的是You have to do this after you have attached.,但不清楚您将调试器附加到的方式/内容。从.xcarchive 构建的.ipa?有了这个我得到Could not attach to pid : “123” unable to attach...在这一步之前需要添加dsyms吗?
    【解决方案2】:

    吉姆·英厄姆,感谢您的回答。

    我找到了无法调试到静态库的原因。在每个 Xcode 项目中,“部署”部分下都有一个名为“Strip Linked Product”的设置。在我的所有项目中,此设置都设置为“是”。

    为了调试通过归档构建的应用程序的静态库,我在每个依赖库项目(以及主项目)中将此设置设置为“否”。这也可以针对调试/发布模式进行不同的设置。在此之后,我看到了在归档过程中构建的库符号,并且我能够调试到库代码中。我希望这对某人有所帮助。

    不幸的是(或者幸运的是)当库符号没有被剥离时,我试图调试的错误不再重现。也许当符号被剥离时会发生一些事情,我需要进一步调查。

    【讨论】:

    • 确保您正在构建的应用程序版本中仍然存在符号,并且与您第一次看到错误的版本具有相同的优化。剥离或不剥离符号真的不应该导致程序行为不同,而优化可以改变程序的行为并揭示 -O0 隐藏的细微错误。
    • 具有讽刺意味的是,问题在于剥离符号。在某些时候,程序会调用 dlopen() 和 dlsym()。然后我看到应用程序的“条形链接产品”设置将“条形样式”设置设置为“所有符号”。这导致 dlsym() 失败,因为它找不到任何符号,因此存在错误。一旦我将“条形样式”更改为“仅非全局符号”,问题就消失了。
    【解决方案3】:

    我一直在为同样的问题而苦苦挣扎,仅从 Xcode 启动我的应用程序不是一种选择 - 我必须构建 IPA,将其旁加载到 iOS 设备上,然后进行调试。最终,我能够通过以下步骤完成这项工作:

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

    2) 更改调试版本的以下设置

    • 保留私有外部符号 (KEEP_PRIVATE_EXTERNS):是
    • 启用位码 (ENABLE_BITCODE):否
    • 带状链接产品 (STRIP_INSTALLED_PRODUCT):否

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

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

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

    如果您想从一开始就调试代码,只需放置一个休眠一两秒的循环,然后检查主函数顶部的标志 - 当您进入调试器时,只需更改标志让它逃脱循环。

    【讨论】:

    • 请您详细说明在哪里/如何执行步骤 2,3?我的档案中有一个导出的 IPA 文件...如何访问它的构建设置?
    • @CasparWylie 在项目的构建设置中搜索上面的 CAPS_HINTS。
    • 不幸的是,我得到了error: attach by pid '69234' failed -- attach failed (Not allowed to attach to process. Look in the console messages (Console.app), near the debugserver entries when the attached failed. The subsystem that denied the attach permission will likely have logged an informative message about why it was denied.),但控制台中没有更多信息。
    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 2017-01-22
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多