是否可以调试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是在其他机器构建,或者构建后源码目录有变动,可在Xcode
Preferences > Locations > Custom Paths中添加自定义映射:Command Line Path填构建时的源码根目录(即当时执行构建脚本的目录路径),Path填当前本地存放Framework源码的根目录,即可完成路径匹配。
三、调试验证
打开Framework源码工程(也可直接将源码目录拖入主工程,不要勾选拷贝和加入任何Target),在对应代码行打断点,运行主工程触发Framework相关逻辑即可正常命中断点调试。
内容的提问来源于stack exchange,提问作者meaning-matters
相关产品推荐
相关产品推荐

