首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xcode 9-框架断点

Xcode 9-框架断点
EN

Stack Overflow用户
提问于 2017-08-31 02:47:20
回答 3查看 3.6K关注 0票数 7

在Xcode 7和8中,我已经能够通过在包含框架项目的xc工作区中运行包含应用程序来调试我开发的框架。如果我在框架中设置断点,它们将在运行时被触发。

在Xcode 9 beta 6中,情况不再如此。到目前为止,在模拟器上调试时,执行只在框架断点停止。当我在物理设备上调试时,框架断点不会停止执行,它们似乎被完全忽略。

如何使框架断点正常工作,以便在Xcode 9中的iOS 11上调试框架?

FWIW:通过在框架根目录中运行pod install创建了by工作区。然后,我将示例应用程序的xcodeproj添加到xc工作区。在Xcode 9 beta 6上进行测试之前,它一直都是可用的。

编辑:确认此行为仍然发生在Xcode 9.0的GM种子上。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-24 17:48:18

TL;DR -我需要更改我的归档脚本在调试或准备发行版时读取的目录。现在,在调试时,如果希望断点在运行时正常工作,我需要确保将框架方案的归档配置设置为"Debug“。我只在准备生产准备好的.framework时才使用“production”。

我通过bug报告联系了苹果开发人员。我将粘贴下面的回复。当他提到"lipo“时,他指的是我在一个后存档脚本中进行的调用,该脚本从模拟器和物理设备构建中创建了一个通用框架。

Xcode必须将正在运行的二进制代码与仍在您的计算机上的调试符号匹配。Xcode应该自动做到这一点,但听起来有些东西是在Xcode背后移动的。要知道调试信息是否匹配,您可以查看(lldb)映像列表和/Mac/path/ To /Build/Products/ debug -iphoneos%侏儒转储--uuid iOS-App.app/iOS-App -App-App的输出,这些输出也适用于dylibs。 您的框架在地址周围有括号吗?这是个明确的信号,表示lldb找不到你的符号。 如果图像列表中的UUID与侏儒转储不匹配,那么有些东西在运行之前修改了可执行文件,并且与您构建的产品不匹配。我们不确定lipo是否会这样做,我在您的脚本中看到了,但肯定会检查。如果调试信息不再存在,就不能做太多的事情。 如果您可以在磁盘上找到与UUID匹配的正确的可执行文件,您可以简单地(lldb)映像添加/Mac/path/to/DerivedData-asdfasdfadf/Products/Debug-iphoneos/iOS-App.app/Frameworks/Framework 此外,Xcode使用聚光灯在您的计算机上查找符号。为了避免在构建过程中不断地重新索引,包含.o文件和存储调试信息的其他地方的Intermediates/目录被列入黑名单。在Xcode 9.0中,这种情况发生得相当晚,所以这可能是您的东西以前工作过的原因。

当我在运行时运行(lldb) image list时,我发现我的框架的UUID与dwarfdump/Mac/path/to/Build/Products/Debug-iphoneos上报告的不匹配。

最后,我修改了我的后存档脚本,以更改它在创建框架时读取的构建目录。当我将归档配置设置为"Debug“时,它现在将从读取。当我将它设置为“释放”时,它从${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}读取

代码语言:javascript
复制
# 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}"

如果道路混乱,我不怪你。从本质上讲,工作空间看起来像:

代码语言:javascript
复制
RootDirectory
|__SampleApp
   |__SampleApp.xcodeproj
|__Frameworks
   |__MyFramework.framework
   |__AnotherFramework.framework
|__MyFramework
   |__MyFramework.xcworkspace
   |__MyFramework.xcodeproj
   |__Podfile (etc..)
票数 3
EN

Stack Overflow用户

发布于 2017-09-19 13:11:03

我的场景是:

我在另一条路上有我的框架。通常我在构建.framework时会得到它。然后我将框架(MyFramework.framework)文件添加到我的项目中。

我的建议是:

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

  1. 当程序执行到达断点时,按下步骤进入按钮。

现在,执行将进入您的框架源区域,在这一点上,您必须在框架中的任何地方添加新断点

这是Xcode 9和iOS 11中的工作解决方案,希望这对您有所帮助。祝好运。

票数 1
EN

Stack Overflow用户

发布于 2022-09-23 16:23:46

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

代码语言:javascript
复制
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执行以上两个步骤

现在运行您的abc项目和框架断点也将工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45972443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档