使用本地构建的Flutter iOS引擎时,如何正确调试引擎Objective-C/C++源码?
使用本地构建的Flutter iOS引擎时,如何正确调试引擎Objective-C/C++源码?
我之前也遇到过一模一样的问题!本地编译完Flutter iOS引擎后,调试时LLDB能找到符号但死活找不到源码,每次手动输source map太折腾,后来摸索出几个靠谱的永久解决方法,给你一步步讲:
方法一:给Xcode项目配置自动执行的LLDB映射(项目级生效)
这个方法只针对当前Flutter项目生效,每次启动调试都会自动加载源码映射:
- 打开Xcode,点击顶部菜单栏的
Product->Scheme->Edit Scheme(或者直接按Cmd + <快捷键) - 在弹出的Scheme编辑窗口中,选择左侧的
Run选项卡,切换到Arguments标签页 - 找到
Debugger Commands区域,点击左下角的+号,添加一行LLDB命令:
注意把后面的路径替换成你本地引擎源码中settings set target.source-map /flutter /Users/chenghuanzhong/Desktop/engine/src/flutterflutter目录的实际路径 - 关闭窗口,下次启动调试时Xcode会自动执行这个命令,源码路径就会自动映射了
方法二:配置全局LLDB初始化文件(所有项目通用)
如果你经常用本地引擎调试不同项目,全局配置更省心:
- 打开终端,检查用户目录下有没有
.lldbinit文件:ls ~/.lldbinit - 如果没有的话,直接创建一个:
touch ~/.lldbinit - 用文本编辑器打开这个文件(比如用
open -e ~/.lldbinit在Mac上打开),添加一行:settings set target.source-map /flutter /Users/chenghuanzhong/Desktop/engine/src/flutter - 保存文件后,重启Xcode,以后不管调试哪个项目,LLDB都会自动加载这个源码映射
方法三:检查本地引擎的构建配置是否正确
有时候调试信息缺失也会导致找不到源码,要确保你构建的是带完整调试信息的引擎版本:
- 确认构建命令是正确的,比如针对iOS模拟器arm64的调试版本,构建命令应该是:
这里的./flutter/tools/gn --ios --unoptimized --simulator --arm64 ninja -C out/ios_debug_sim_unopt_arm64--unoptimized是关键,它会生成未优化的、带完整调试符号的引擎二进制,方便调试 - 另外,Xcode中
Generated.xcconfig的配置要确保正确:
你已经添加的FLUTTER_ENGINE、LOCAL_ENGINE、LOCAL_ENGINE_HOST是对的,要保证FLUTTER_ENGINE指向的是引擎源码的根目录(也就是/Users/chenghuanzhong/Desktop/engine/src),而不是子目录
方法四:临时补救——单个文件手动映射(紧急情况用)
如果上面的配置都没生效,或者只是临时调试某个文件,可以手动指定路径:
当LLDB提示找不到文件时,在Xcode的调试导航栏中,右键点击对应的栈帧(比如-[FlutterViewController touchesBegan:withEvent:]),选择Edit Source Path...,然后把默认的/flutter/...路径替换成你本地的实际源码路径,比如把/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm改成/Users/chenghuanzhong/Desktop/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
额外注意点
- 如果你移动了本地引擎的源码目录,一定要同步更新source map中的路径,不然又会出现找不到文件的问题
- 有时候Xcode的缓存会搞鬼,遇到奇怪的问题可以试试清理Derived Data(
Xcode->Settings->Locations-> 点击Derived Data旁边的箭头,删除对应项目的缓存目录),然后重启Xcode重新构建 - 确保Xcode用的是LLDB调试器(默认就是),不要切换成GDB,GDB对这种源码映射的支持不如LLDB好
这样配置完之后,你应该就能正常调试FlutterViewController.mm这类引擎源码了,断点、单步调试都能正常工作~




