如何定位Flutter Android端SIGSEGV空指针解引用崩溃原因?
Flutter Android应用空指针解引用崩溃定位方案
问题概述
在Android Studio中运行Flutter应用时触发SIGSEGV(空指针解引用)崩溃,调试模式下同样可复现,但栈追踪信息无法直接定位到具体代码。误以为flutter symbolize工具仅适用于混淆后的项目,需要明确如何定位此次崩溃原因。
崩溃日志
F/libc (28855): Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 28898 (1.ui), pid 28855 (nalquest.survey) *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: 'motorola/guamna_retail/guamna:11/RZA31.Q2-146-14-22-2/8a7d1:user/release-keys' Revision: 'pvt' ABI: 'arm64' Timestamp: 2023-09-15 11:29:06-0400 pid: 28855, tid: 28898, name: 1.ui >>> com.signalquest.survey <<< uid: 10497 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 Cause: null pointer dereference x0 0000006e0069b9e1 x1 0000000000000000 x2 0000000000000000 x3 0000000000000000 x4 0000000000000000 x5 0000006e0920cfd1 x6 0000006e0a3d4430 x7 000000000000534f x8 0000000000000007 x9 0000000000000001 x10 000000700cbf4c68 x11 0000000000000001 x12 000000000003c000 x13 0000000000000010 x14 0000006e09980081 x15 0000007009c09ae8 x16 0000007009b31000 x17 0000006e08f00e01 x18 000000700980a000 x19 0000007009b30000 x20 0000006e08052be1 x21 b4000071d3115f70 x22 0000006e00008081 x23 b4000071d3115f70 x24 0000006e08456f51 x25 0000007009b30000 x26 b4000071d3115f70 x27 0000006e08456f20 x28 000000080000006e x29 0000007009c09af8 lr 0000007012308184 sp 0000007009b30000 pc 0000006fe493497c pst 0000000020000000 backtrace: #00 pc 000000000003497c [anon:dart-code]
Flutter环境信息
[✓] Flutter (Channel stable, 3.13.2, on macOS 13.4.1 22F770820d darwin-arm64, locale en-US) • Flutter version 3.13.2 on channel stable at /Users/csabbey/homebrew/Caskroom/flutter/3.3.6/flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision ff5b5b5fa6 (3 weeks ago), 2023-08-24 08:12:28 -0500 • Engine revision b20183e040 • Dart version 3.1.0 • DevTools version 2.25.0
pubspec直接依赖项
- build_runner 2.4.5
- collection 1.17.2
- community_charts_flutter 1.0.1
- connectivity_plus 4.0.1
- convert 3.1.1
- csv 5.0.2
- drift 2.9.0
- drift_db_viewer 2.0.0
- drift_dev 2.9.0
- dxf 3.1.1
- ffi 2.0.2
- ffigen 8.0.2
- file_picker 5.2.10
- firebase_auth 4.6.3
- firebase_core 2.14.0
- firebase_core_web 2.6.0
- firebase_crashlytics 3.3.3
- flutter 0.0.0
- flutter_blue_plus 1.14.16
- flutter_colorpicker 1.0.3
- flutter_compass 0.7.0
- flutter_keyboard_visibility_web 2.0.0
- flutter_launcher_icons 0.13.1
- flutter_lints 2.0.1
- flutter_midi 1.1.0
- flutter_native_splash 2.3.1
- flutter_plugin_android_lifecycle 2.0.15
- flutter_secure_storage 8.0.0
- flutter_secure_storage_web 1.1.1
- flutter_signin_button 2.0.0
- flutter_test 0.0.0
- flutter_typeahead 4.6.2
- flutter_web_plugins 0.0.0
- geolocator 9.0.2
- geolocator_web 2.1.6
- get_it 7.6.0
- google_sign_in 6.1.4
- http 0.13.6
- http_parser 4.0.2
- integration_test 0.0.0
- intl 0.18.1
- logger 1.4.0
- maplibre_gl 0.16.0
- mockito 5.4.2
- numberpicker 2.1.2
- package_info_plus 3.1.2
- path 1.8.3
- path_provider 2.0.15
- patrol 2.0.2
- permission_handler 10.4.3
- screen_brightness 0.2.2
- share_plus 6.3.4
- sqlite3_flutter_libs 0.5.15
- synchronized 3.1.0
- uuid 3.0.7
- wakelock 0.6.2
定位步骤
1. 使用flutter symbolize解析栈追踪
不管项目是否混淆,只要是Native层或Dart编译后的栈追踪,都可以用该工具解析:
- 找到对应构建的符号文件:debug构建的符号文件位于
build/app/intermediates/flutter/debug/app.so;release构建在build/app/intermediates/flutter/release/app.so - 将崩溃日志保存为
crash_log.txt,执行命令:
解析后会得到具体的代码位置。flutter symbolize -i crash_log.txt -d path/to/app.so
2. 开启详细调试日志捕捉前置异常
- 运行应用时添加
--verbose参数,获取崩溃前的完整Dart层日志:flutter run --verbose - 借助Flutter DevTools的Debugger标签,在崩溃触发的操作路径上设置断点,逐步排查变量是否为空。
3. 排查Native交互类依赖的问题
从依赖列表看,flutter_blue_plus、flutter_compass、geolocator、maplibre_gl、ffi这类涉及Native交互的库容易触发空指针:
- 暂时注释掉近期更新或怀疑的库,验证崩溃是否消失,缩小排查范围。
- 检查这类库的初始化逻辑,比如是否在未获取权限时就调用Native方法,导致返回空指针后被解引用。
4. 检查Dart层参数传递是否为空
Native层的空指针可能由Dart层传入null触发:
- 梳理所有调用Native插件的代码,确保传入的参数不为null。
- 启用Dart的空安全严格模式,提前在编译阶段发现潜在的空指针问题。
5. 验证设备和系统版本兼容性
崩溃发生在Android 11的摩托罗拉设备,测试其他Android版本(如12/13)或品牌设备,判断是否为设备特定问题。
内容的提问来源于stack exchange,提问作者Crag
相关产品推荐
相关产品推荐

