一个让人头疼的 native crash,一段从 tombstone 到源码的调试之旅。
1. 问题现象
StreamClip 是我维护的一个 Android 视频剪辑 App,核心能力依赖 FFmpeg。为了 GPL 合规和版本控制,我从源码自编译了 ffmpeg-kit 8.1 AAR。
一切看起来很顺利,直到我发现一个诡异的问题:
第一次压缩视频正常完成,第二次压缩 App 必定闪退。
Logcat 里只有冰冷的几行:
F/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x000000030000005b
DEBUG: pid: 32194, tid: 32600, name: pool-7-thread-2 >>> com.example.streamclip <<<
AOSP 原生的 FFmpeg 命令行工具是单进程短生命周期,但 ffmpeg-kit 是嵌入在 App 进程里的,同一个进程多次调用 execute()——这就是问题的根源。
2. 构建 Debug SO
Native crash 调试的第一步:你得有符号表。
Release 版的 .so 都被 strip 过了,栈里只有地址没有函数名,等于天书。所以我重新编译了一套 debug 版本:
# 修改 build-ffmpeg-ndk-27d.sh
# CFLAGS 从 -Os 改为 -O0 -g
# 去掉 –strip 参数
# 编译 JNI wrapper(debug 模式)
./build-jni-ndk-r27d.sh –debug
# 打包 debug AAR
./build-aar-ndk-r27d.sh –debug
关键技巧:obj/local/arm64-v8a/libffmpegkit.so 是未 strip 的(含 debug_info),libs/ 下的则被 strip 了。ndk-stack 要用 obj/local/ 下的版本。
验证符号:
file libffmpegkit.so
#





