从 Xcode 10 中的自定义"embedded framework" "Attach to Process by PID or Name"后无法命中断点



我一直在尝试调试我在过去几年和最近(1-2 周前(在 Xcode 10 发布之前一直在使用/开发的自定义嵌入式框架的 objective-c 代码,一切都运行良好。我能够使用调试配置构建我的嵌入式框架,创建一个应用程序(使用 NativeScript(,将其部署到模拟器,打开我的框架的.xcodeproject,转到调试>按 PID 或名称附加到进程,选择应用程序并在我的 objective-c 代码中添加断点来调试它。

但是今天我尝试做同样的事情,断点无法命中。我知道我的嵌入式框架是内置调试配置的,因为存在.dSYM文件。同样在附加进程后,如果我使用按钮停止它,应用程序将在模拟器中停止,因此它必须正确连接。

有没有人遇到过这样的问题?

编辑: 我确实通过比较nm -a <lib>的输出和此答案的nm <lib>来验证项目中的嵌入式框架是否包含调试符号。

编辑 2:

场景非常简单:

  1. 创建动态嵌入式框架
  2. 构建其 .framework 和 .framework.dSYS 文件
  3. 将其添加到项目的嵌入式框架中
  4. 将该项目构建到应用中
  5. 将其部署到模拟器
  6. 打开框架的项目
  7. 将其附加到进程
  8. 尝试命中断点。

将其部署到模拟器时,请尝试停止xcode进程并从simulator手动启动应用,然后附加该Process。有关分步说明,请参阅此answer。如何在 Xcode 中的框架中进行调试?

经过 3 天的研究和挖掘,我设法解决了这个问题。它的来源对我来说仍然未知,看起来它是 9.4.1 和 10 之间 xcodebuild 的某种重大更改,但听起来它很可能是故意的或错误修复。

简短的回答: 确保与胖库一起使用的 .dSYM 适用于正确的设备(模拟器或真实设备(

TL;博士

所以问题是我在附加到模拟器时使用错误的 .dSYM 文件,而 .dSYM 文件是从真实设备的 xcodebuild 中获取的。因此,我的构建阶段(在 bash 中完成(的步骤如下:

  • 构建模拟器框架
  • 为真正的iPhone构建框架
  • 使用上面创建的 .framework 文件使用 xcrun 创建一个胖库
  • 从派生数据中的实际设备位置复制 .dSYM(这在 XCode 10 之后是错误的(

我看到这是不正确的,但它以前在执行"附加到进程"时从未出现任何问题,但在 XCode 10 中这不再有效(使用为带有模拟器的设备创建的调试符号(

相关内容

最新更新