如何在Xcode中的框架中进行调试?

Jas*_*Lee 13 iphone xcode objective-c ios

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

networkLib项目输出一个名为的框架myNetKit.framework,供其使用usingLibDemo.

在此输入图像描述

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

在此输入图像描述

所以我知道崩溃的地方:

在此输入图像描述

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

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

非常感谢任何提示.

mer*_*jik 11

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

您可以:

  1. 构建您的框架项目(在此示例中为"networkLib")
  2. 将项目输出("myNetKit.framework")复制到目标项目("usingLibDemo")
  3. 在您的设备上运行目标项目("usingLibDemo")
  4. 停止过程
  5. 手动从您的设备启动应用程序("usingLibDemo")
  6. 打开框架项目和附加到应用程序的进程(在步骤5中启动).在Xcode 8中:Debug-> Attach to Process->选择应用程序的名称.

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

  • 如果这不起作用,请在此处查看此答案 /sf/answers/954696431/ (2认同)

Moo*_*ker 7

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

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

这有点痛苦,但它可以工作,如果你不想,你不必将库项目作为一个子项目.


小智 5

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


小智 5

处理多个框架项目时,请使用XCode Workspace。当您使用工作空间时,断点将起作用,并且您可以发现崩溃而无需进行大量来回调试。从长远来看,管理您的框架会容易得多。


Shi*_*gga 5

考虑到下面的工作情况,你有单独的框架项目,并添加a.framework一些B项目

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

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