debugging Xcode 9 -框架断点

imzjd6km  于 2022-11-14  发布在  其他
关注(0)|答案(3)|浏览(142)

在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种子上仍会发生此行为。

k3fezbri

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不匹配。
我最终修改了我的归档后脚本,以改变它在创建框架时从哪个构建目录读取。

# NOTE: This script creates a universal framework (device and simulator). However, *** for this to work: a Simulator target must be built first, and then Archive on the Device ***

BUILD_PRODUCTS="${SYMROOT}/../../../../Products"
SIM_PATH="${BUILD_PRODUCTS}/Debug-iphonesimulator/${TARGET_NAME}.framework"
if [ "${CONFIGURATION}" = "Debug" ]; then
 DEV_PATH="${BUILD_PRODUCTS}/Debug-iphoneos/${TARGET_NAME}.framework"
elif [ "${CONFIGURATION}" = "Release" ]; then
 DEV_PATH="${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/${TARGET_NAME}.framework"
fi
DEST_PATH="${PROJECT_DIR}/../Frameworks/${TARGET_NAME}.framework"

rm -rf "${DEST_PATH}"
mkdir "${DEST_PATH}"
cp -r "${DEV_PATH}/" "${DEST_PATH}/"
rm -f "${DEST_PATH}/${TARGET_NAME}"
cp -Rn "${SIM_PATH}/Modules/" "${DEST_PATH}/Modules/"

lipo -create "${SIM_PATH}/${TARGET_NAME}" "${DEV_PATH}/${TARGET_NAME}" -output "${DEST_PATH}/${TARGET_NAME}"

如果路径令人困惑,我不怪你。从本质上讲,工作空间看起来像:

RootDirectory
|__SampleApp
   |__SampleApp.xcodeproj
|__Frameworks
   |__MyFramework.framework
   |__AnotherFramework.framework
|__MyFramework
   |__MyFramework.xcworkspace
   |__MyFramework.xcodeproj
   |__Podfile (etc..)
z31licg0

z31licg02#

我的方案是:

我把我的框架放在了另一个路径上。通常我在构建它的时候会得到 .framework。然后我把这个框架(MyFramework.framework)文件添加到我的项目中。

我的建议是:

1.在框架调用之前添加一个新断点。

1.当程序执行到达断点时,按此Step Into按钮。

现在,执行将进入框架源代码区,此时,您必须在框架中任何需要的位置添加新断点
这是Xcode 9和iOS 11中的工作解决方案。我希望这对你有帮助。祝你好运。

vh0rcniy

vh0rcniy3#

如果您已经将xyz.framework集成到abc项目中,则可以执行以下步骤。

1)For project abc, add a breakpoints at the places you want.
2)Go to breakpoint list, select all breakpoints, right click and click move breakpoint to user.

对xyz.framework执行以上2个步骤
现在运行abc项目,框架断点也将工作。

相关问题