文章目录
- 一、遇到问题
- 二、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查询
E:\umeng\CrashDemo-1.2.0>c:\Users\Administrator\AppData\Local\Android\Sdk\ndk\22.0.7026061\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line -e app/.cxx/cmake/debug/armeabi-v7a/libnative-lib.so 000000000001d67c 000000000001d56c 000000000001d4a0
/buildbot/src/android/ndk-release-r22/toolchain/llvm-project/libcxx/../../../toolchain/llvm-project/libcxxabi/src/demangle/ItaniumDemangle.h:?
/buildbot/src/android/ndk-release-r22/toolchain/llvm-project/libcxx/../../../toolchain/llvm-project/libcxxabi/src/demangle/ItaniumDemangle.h:2816
/buildbot/src/android/ndk-release-r22/toolchain/llvm-project/libcxx/../../../toolchain/llvm-project/libcxxabi/src/cxa_demangle.cpp:309
- 按照log的打印顺序,我们从下往上看,先执行
cxa_demangle.cpp:309
- 但是,
cxa_demangle
是个啥东西呢 - 新的ABI委托执行C++运行库的入口
- 就是这个入口走错了?走到了空指针?
char* abi::__cxa_demangle ( const char * mangled_name,
char * output_buffer,
size_t * length,
int * status
)
New ABI-mandated entry point in the C++ runtime library for demangling.
char* abi::__cxa_demangle(const char* mangled_name, char* output_buffer, size_t* length, int* status)
- 这时候定睛一看,
Java_com_umeng_crashdemo_MainActivity_stringFromJNI
- 那就先查它
五、修改代码
代码定位到这里来,一看代码,很简单啊
改改改!!!
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_umeng_crashdemo_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
// std::string hello = NULL;
return env->NewStringUTF(hello.c_str());
}
六、后续~重新打包个APK,发给客户小姐姐。
翘着二郎腿,再开一瓶冰阔落~
果不其然~
客户小姐姐很开心,说我真棒,要把她闺蜜介绍给我。
咦,我的春天来了~
我的嘴角不自觉扬起45°的微笑。
哎,醒醒,醒醒,要debug了~~~