在Xcode 7和8中,我已经能够通过在包含框架项目的xcworkspace中运行包含应用程序来调试我开发的框架。如果我在框架中设置断点,它们将在运行时被触发。
在Xcode 9 beta 6中,情况不再是这样。到目前为止,在模拟器上调试时,执行只在框架断点处停止。当我在物理设备上调试时,框架断点并没有停止执行,似乎它们完全被忽略了。
如何让框架断点正常工作,以便在Xcode 9中在iOS 11上调试我的框架?
FWIW:xcworkspace是通过在框架根目录中运行pod install
创建的。然后我将示例应用程序的xcodeproj添加到xcworkspace中。在Xcode 9 beta 6上测试之前,这一直是可用的。
编辑:确认Xcode 9.0的GM种子上仍会发生此行为。
3条答案
按热度按时间k3fezbri1#
TL;DR-当调试或准备发布时,我需要更改存档脚本的读取目录。现在,当调试时,如果我希望断点在运行时正常工作,我需要确保将框架方案的存档配置设置为“Debug”。我只在准备生产就绪的. framework时使用“Release”。
我通过bug报告联系了苹果开发者支持部门。我将在下面粘贴回复。当他提到“lipo”时,他指的是我在一个存档后脚本中所做的调用,该脚本从模拟器和物理设备构建中创建了一个通用框架。
Xcode必须将正在运行的二进制文件与仍在您机器上的调试符号相匹配。Xcode应该会自动完成这一操作,但听起来有些东西似乎是在Xcode背后移动的。要知道调试信息是否匹配,您可以查看(lldb)图像列表和/Mac/path/to/Build/Products/Debug-iphoneos% dwarfdump --uuid www.example.com的输出iOS-App.app/iOS-App,它们也可以在dylib上工作。
你的框架在地址周围有括号吗?这是lldb找不到你的符号的一个明显迹象。
如果图像列表中的UUID与dwarfdump不匹配,那么在运行之前,可执行文件已经被修改,与您构建的产品不匹配。我们不确定lipo是否会这样做,我在您的脚本中看到了这一点,但肯定会检查。如果调试信息不再存在,就没有什么可以做的了。
如果您可以在磁盘上找到具有匹配UUID的正确可执行文件,则只需(lldb)image add /Mac/path/to/DerivedData-asdfasdfadf/Products/Debug-iphoneos/iOS-App.app/Frameworks/Framework
此外,Xcode还使用Spotlight来查找您机器上的符号。为了避免在构建时不断地重新索引,包含.o文件和其他存储调试信息的位置的Intermediates/目录被列入黑名单。这在Xcode 9.0中发生得相当晚,所以可能是您的东西之前工作正常的原因。
当我在运行时运行
(lldb) image list
时,我发现我的框架的UUID与dwarfdump
在/Mac/path/to/Build/Products/Debug-iphoneos
报告的UUID不匹配。我最终修改了我的归档后脚本,以改变它在创建框架时从哪个构建目录读取。
如果路径令人困惑,我不怪你。从本质上讲,工作空间看起来像:
z31licg02#
我的方案是:
我把我的框架放在了另一个路径上。通常我在构建它的时候会得到 .framework。然后我把这个框架(MyFramework.framework)文件添加到我的项目中。
我的建议是:
1.在框架调用之前添加一个新断点。
1.当程序执行到达断点时,按此Step Into按钮。
现在,执行将进入框架源代码区,此时,您必须在框架中任何需要的位置添加新断点。
这是Xcode 9和iOS 11中的工作解决方案。我希望这对你有帮助。祝你好运。
vh0rcniy3#
如果您已经将xyz.framework集成到abc项目中,则可以执行以下步骤。
对xyz.framework执行以上2个步骤
现在运行abc项目,框架断点也将工作。