16

我有两个项目,一个是networkLib用于登录和一些其他网络功能,另一个是usingLibDemo. 所以我拥有这两个项目的所有源代码。

networkLib项目输出一个名为 的框架,myNetKit.frameworkusingLibDemo.

在此处输入图像描述

现在我成功用于myNetKit.framework登录,但有时它会崩溃,可能在没有堆栈信息的 main() 中,但有时 Xcode 会给我如下堆栈信息:

在此处输入图像描述

所以我知道它在哪里崩溃:

在此处输入图像描述

但是Utils.m没有暴露,Xcode如何获取堆栈信息和崩溃线,并最终为我打开源文件?因为我的磁盘中有源代码?

如果是这样,当它没有崩溃时,我该如何myNetKit.framework逐步调试?

非常感谢任何提示。

4

6 回答 6

23

如果将来有人会有同样的问题(现在我使用的是 Xcode 8):

你可以:

  1. 构建您的框架项目(在本例中为“networkLib”)
  2. 将项目输出(“myNetKit.framework”)复制到目标项目(“usingLibDemo”)
  3. 在您的设备上运行目标项目(“usingLibDemo”)
  4. 停止进程
  5. 手动从您的设备启动应用程序(“usingLibDemo”)
  6. 打开框架项目并附加到应用程序的进程(在步骤 5 中启动)。在 Xcode 8 中:调试->附加到进程->选择您的应用程序的名称。

不要忘记在你的框架项目中设置一些断点。

于 2017-02-07T13:59:12.460 回答
7

当使用所有符号构建库时,它包含嵌入自身的每个源文件的完整路径。如果您使用十六进制查看器打开 .a,您实际上可以看到这一点。有了这个,XCode 将知道如何访问源文件。

设置断点更具挑战性。您基本上必须通过单步执行这些文件中的方法,让 XCode 从您的库中慢慢发现源文件。XCode 打开文件后,您可以在其中的任何位置设置断点。

这有点痛苦,但它有效,如果您不想,您不必将库项目设为子项目。

于 2013-08-23T10:28:29.973 回答
6

以下工作考虑您单独拥有框架项目并将a.framework添加到某个项目 B的场景

  1. 转到您的项目 B,在任何地方添加断点。
  2. 转到断点视图(所有断点都可以视为列表),右键单击断点并单击将断点移动到用户。
  3. 转到a.framework并重复步骤 1 和 2,但对于您的框架项目。
  4. 现在切换回项目 B 并在模拟器/设备上运行该项目。

您现在将看到程序也停止在框架中设置的断点处。

于 2018-04-10T18:58:29.400 回答
5

您还可以将整个库 ( networkLib) 项目添加到您的项目中,并通过在项目设置中添加依赖项来动态链接库。因此,您可以在项目中拥有所有源代码。所以你可以在运行时调试它。

于 2013-03-27T09:12:58.047 回答
5

在处理多个框架项目时使用 XCode Workspace。当您使用工作区时,断点将起作用,您可以在没有来回调试负载的情况下找到崩溃。从长远来看,管理您的框架会容易得多。

于 2013-03-27T09:13:35.017 回答
-1

您应该调试单独输出框架的项目 networkLib。该框架没有类似应用程序的结构,因此无法调试其他项目中的框架文件。

于 2013-03-27T08:59:22.467 回答