摘要: 雖然Flutter使用的逐步增加柴梆,iOS Flutter 底層引擎的Crash也逐漸增加当辐。由于release出去的底層引擎產(chǎn)物Flutter.framework 已經(jīng)剝離符號表,所以在捕捉到的Flutter Crash都無法確定具體方法名菇篡。
本文提供一個常規(guī)操作,可以用于分析出底層Crash的方法名思恐。
1 確定FlutterEngine版本
FlutterEngine 是在Flutter SDK 中被引用,并確定版本沾谜。初始化的方式,是從遠(yuǎn)程下載胀莹。
例如:
如果當(dāng)前使用的FlutterSDK的版本是 v1.9.1+hotfix6 (https://github.com/flutter/flutter/tree/v1.9.1+hotfix.6)
對應(yīng)的FlutterEngine的版本是:b863200c37df4ed378042de11c4e9ff34e4e58c9? (?https://github.com/flutter/engine/commit/b863200c37df4ed378042de11c4e9ff34e4e58c9)
FlutterEngine 的版本可以通過FlutterSDK中的文件查看:$FLUTTER_ROOT/bin/internal/engine.version
2 下載FlutterEngine符號表
確定版本后基跑,就可以到谷歌的網(wǎng)站上下載對應(yīng)的 dSYM 文件
3 分析具體的獲取方法名?
捕捉到Crash后,在其中可以讀取到Flutter引擎Crash的目標(biāo)地址和啟示地址描焰,用如下命令行 媳否,就可以映射出各個方法名。
(1)?xcrun atos -o Flutter.dSYM/Contents/Resources/DWARF/Flutter --arch arm64 -l 0x107278000
指定對應(yīng)的 arch(arm64) 和 FlutterEngine Crash 方法的起始地址(0x107278000)
(2)然后終端處于等待輸入狀態(tài)荆秦,只要將上圖中各個目標(biāo)地址逐個輸入篱竭,就可以獲取對應(yīng)的方法名
0x00000001072b07c0
std::__1::__function::__func,?void?(fml::TaskQueueId)>::operator()(fml::TaskQueueId&&) (in Flutter) (functional:1923)
0x00000001072ae65c
fml::MessageLoopTaskQueues::MergedQueuesRunner::InvokeMerged(std::__1::function<void?(fml::TaskQueueId)>) (in Flutter) (merged_queues_runner.cc:33)
0x00000001072b06d0
fml::MessageLoopTaskQueues::NotifyObservers(fml::TaskQueueId) (in Flutter) (message_loop_task_queues.cc:142)
0x00000001072ad7bc
fml::MessageLoopImpl::FlushTasks(fml::FlushType) (in Flutter) (message_loop_impl.cc:137)
0x00000001072b1ce8
fml::MessageLoopDarwin::OnTimerFire(__CFRunLoopTimer*, fml::MessageLoopDarwin*) (in Flutter) (message_loop_darwin.mm:76)