You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否可以调试XCFramework代码?如何配置可调试XCFramework内的功能?

问题背景

我参与开发的应用中有部分功能以XCFramework形式分发,该XCFramework通过如下脚本构建:

#!/bin/bash

while getopts s:w: flag
do
    case "${flag}" in
        s) scheme=${OPTARG};;
        w) workspace="-workspace ${OPTARG}.xcworkspace";;
    esac
done

if [ -z "$scheme" ]
then
      echo "$(basename $BASH_SOURCE) -- build XCFramework"
      echo ""
      echo "$(basename $BASH_SOURCE) -s scheme-name [ -w workspace0-name ]"
      echo ""
      echo "Run this script from the top-level directory of your framework."
      echo "The build result will be here: archives/<scheme-name>.xcframework"
      exit
fi

rm -rf archives/$scheme.xcframework

xcodebuild archive \
           $workspace \
           -scheme $scheme \
           -destination "generic/platform=iOS Simulator" \
           -archivePath "archives/$scheme-Simulator" \
           SKIP_INSTALL=NO \
           BUILD_LIBRARY_FOR_DISTRIBUTION=YES

xcodebuild archive \
           $workspace \
           -scheme $scheme \
           -destination "generic/platform=iOS" \
           -archivePath "archives/$scheme" \
           SKIP_INSTALL=NO \
           BUILD_LIBRARY_FOR_DISTRIBUTION=YES

cp -r archives/$scheme-Simulator.xcarchive/Products/Library/Frameworks/. archives/simulator
cp -r archives/$scheme.xcarchive/Products/Library/Frameworks/. archives/ios

function GetUUID() {
    local arch=$1
    local binary=$2
    local dwarfdump_result=$(dwarfdump -u ${binary})
    local regex="UUID: (.*) \((.*)\)"
    if [[ $dwarfdump_result =~ $regex ]]; then
        local result_uuid="${BASH_REMATCH[1]}"
        local result_arch="${BASH_REMATCH[2]}"
        if [ "$result_arch" == "$arch" ]; then
            echo $result_uuid
        fi
    fi
}

BCSYMBOLMAP_UUID=$(GetUUID "arm64" "archives/$scheme.xcarchive/Products/Library/Frameworks/$scheme.framework/$scheme")

xcodebuild -create-xcframework \
           -framework archives/ios/$scheme.framework \
           -debug-symbols ${PWD}/archives/$scheme.xcarchive/dSYMs/$scheme.framework.dSYM \
           -debug-symbols "${PWD}/archives/$scheme.xcarchive/BCSymbolMaps/${BCSYMBOLMAP_UUID}.bcsymbolmap" \
           -framework archives/simulator/$scheme.framework \
           -debug-symbols ${PWD}/archives/$scheme-Simulator.xcarchive/dSYMs/$scheme.framework.dSYM \
           -output archives/$scheme.xcframework

cd archives
rm -rf $scheme-Simulator.xcarchive $scheme.xcarchive ios simulator

构建得到的输出产物<my-framework>.xcframework目录会被复制粘贴到主应用工程中。请问需要完成哪些配置,才可以在运行主应用时调试该XCFramework内部包含的功能?

配置步骤

你现有的构建脚本已经内置了调试符号打包逻辑,只要补充以下配置即可正常调试:

一、Framework 构建侧配置(首次构建前确认)

  • Framework工程的Debug Information Format必须设为DWARF with dSYM File,Debug、Release模式都要开启,否则dSYM不会携带源码映射信息
  • 关闭符号裁剪:Framework工程中Strip Debug Symbols During Copy和Strip Linked Product都设为NO,避免调试信息被编译流程清理
  • 构建完成后不要移动/删除Framework原始源码目录:dSYM中会记录构建时的源码绝对路径,路径变动会导致Xcode无法匹配到源码,断点无法命中

二、主应用工程侧配置

  • 正确嵌入XCFramework:主工程General > Frameworks, Libraries, and Embedded Content中,将<my-framework>.xcframework的嵌入策略设为Embed & Sign
  • 关闭编译优化:主工程运行Scheme的Run模式下,Optimization Level设为None [-O0],同时确认Framework构建时也采用了同等无优化配置,避免代码优化导致断点行号偏移、无法命中
  • 关闭汇编默认显示:Xcode顶部菜单栏Debug > Debug Workflow中,取消勾选Always Show Disassembly,避免断点命中后直接跳转汇编代码
  • (可选)源码路径映射:如果Framework是在其他机器构建,或者构建后源码目录有变动,可在XcodePreferences > Locations > Custom Paths中添加自定义映射:Command Line Path填构建时的源码根目录(即当时执行构建脚本的目录路径),Path填当前本地存放Framework源码的根目录,即可完成路径匹配。

三、调试验证

打开Framework源码工程(也可直接将源码目录拖入主工程,不要勾选拷贝和加入任何Target),在对应代码行打断点,运行主工程触发Framework相关逻辑即可正常命中断点调试。


内容的提问来源于stack exchange,提问作者meaning-matters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:36:03