文章目录
· 一、遇到问题
· 二、Native日志分析
· 三、信号量(signal) 和错误码(code)分析
· 四、PC指针addr2line定位
· 4.1 addr2line路径
· 4.2 so路径
· 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,发给客户小姐姐。
翘着二郎腿,再开一瓶冰阔落~
果不其然~
客户小姐姐很开心,说我真棒,要把她闺蜜介绍给我。
咦,我的春天来了~
我的嘴角不自觉扬起45°的微笑。
哎,醒醒,醒醒,要debug了~~~
作者:康玮剑