如何在Xcode中调试嵌入框架的C++动态库?
如何用Xcode/LLDB调试C++动态库内部
完全可以调试动态库内部,你遇到的问题大概率是缺少调试符号或编译配置不当导致的,以下是具体解决步骤:
1. 确保动态库编译时生成调试符号
- 若动态库是Xcode工程内的目标,在Build Settings中:
- Debug模式下,将Debug Information Format设为
DWARF with dSYM File - 确认Generate Debug Symbols选项设为
YES
- Debug模式下,将Debug Information Format设为
- 若动态库是外部编译的,编译时需给C++编译器加调试参数:
-g(生成DWARF调试信息),如需dSYM可附加-gdwarf-2或对应版本参数
2. 确保Xcode能识别调试符号
- 工程内的动态库目标,配置正确后Xcode会自动关联符号
- 外部引入的动态库,需将
.dSYM文件与动态库放在同一目录;也可通过LLDB命令手动加载:
或target symbols add /path/to/your/library.dylibtarget symbols add /path/to/your/library.dSYM
3. 强制单步进入C++代码
- Xcode中使用**"Step Into Instruction"**(快捷键:Control+F7),逐指令执行可突破默认跳转限制,进入C++动态库代码
- LLDB中可执行命令:
step -m true,强制进入所有函数(包括C++函数)
4. 针对C++的断点设置
- 若Xcode能识别C++源码,直接点击行号左侧添加断点即可
- 若无法直接添加,用LLDB命令查找修饰后的函数名再设置断点:
- 查找函数:
image lookup -n "Foo::bar"(替换为你的C++函数名) - 设置断点:
breakpoint set -n __ZN3Foo3barEi(替换为查到的修饰后名称)
- 查找函数:
5. 解决变量无法打印的问题
- Debug模式下,将动态库的Optimization Level设为
None [-O0],避免编译器优化掉变量 - LLDB中优先用
frame variable(缩写fr v)打印变量,比print更准确;若仍无效,尝试:expr --raw -- 变量名
6. 捕捉C++异常
- 在Xcode的Breakpoint Navigator中,点击"+"选择"Exception Breakpoint",将弹窗内的"Exception"改为"C++",即可在C++异常抛出点停下
内容的提问来源于stack exchange,提问作者xarly
相关产品推荐
相关产品推荐

