文章目录

• 一、遇到问题
• 二、Native日志分析
• 三、信号量(signal) 和 错误码(code)分析
• 四、PC指针addr2line定位
o 4.1 addr2line路径
o 4.2 so路径
o 4.3 addr2line查询
• 五、修改代码
• 六、后续~

一、遇到问题

客户小姐姐反馈一个Crash问题,但是概率很小,开发和测试都没遇到过。
总不能让小姐姐帮忙抓取logcat日志。
逼不得已,用上了杀手锏友盟+U-APM神器,重新给小姐姐更新了一版APK。
然后,开瓶82年的冰阔落,坐等日志上来。

二、Native日志分析

来了来了,日志它来了。
乍看,有点慌。
这是大名鼎鼎的Native Crash啊。
这是隔壁C++组的锅啊,我就说像我这么资深的程序员,怎么可能写出这bug呢~

三、信号量(signal) 和 错误码(code)分析

不过,来都来了,看都看了,且再认真看看具体是哪里有bug~
点击全屏查看,一堆十六进制,咋看有点慌。
不过老司机带路,莫慌,翻开友盟的文档中心的Native崩溃说明
• SIGSEGV,一个进程执行了一个无效的内存引用,或发生段错误。
• SEGV_MAPERR,地址不在 /proc/self/map 映射中
看到这里,有点头绪咯,空指针、段错误?
跟着老司机,接着往下走,go~


四、PC指针addr2line定位

4.1 addr2line路径
• 先找到ndk的路径,在local.properties

• 再找到addr2line
• 其中aarch64-linux-android-4.9和arm-linux-androideabi-4.9都是可以的

4.2 so路径

4.3 addr2line查询


• 按照log的打印顺序,我们从下往上看,先执行cxa_demangle.cpp:309
• 但是,cxa_demangle是个啥东西呢
• 新的ABI委托执行C++运行库的入口
• 就是这个入口走错了?走到了空指针?

• 这时候重新在友盟+U-APM后台定睛一看,Java_com_umeng_crashdemo_MainActivity_stringFromJNI
• 那就先查它

五、修改代码

代码定位到这里来,一看代码,很简单啊
改改改!!!

六、后续~

重新打包个APK,发给客户小姐姐。
翘着二郎腿,再开一瓶冰阔落~
果不其然~
客户小姐姐很开心,说我真棒,要把她闺蜜介绍给我。
咦,我的春天来了~

作者:康玮剑


性能优化实践者
11 声望220 粉丝