Android 5.1 使用addr2line工具定位Native Crash
Android O源码中为了区分不同的厂商vendor引入了HAL,我们在分析从hardware层静态代码时,很难捋清楚从framework层到hardware层的代码执行流程。基于此,我们可在对应cpp文件中通过打印堆栈信息,从而帮助我们快速定位代码执行流程。
Android cpp文件中打印堆栈信息
-
Android.mk文件中添加
LOCAL_C_INCLUDES += $(TOP)/frameworks/native/include/
LOCAL_SHARED_LIBRARIES += libcutils libutils -
在源码中添加
void fun()
{
…
android::CallStack Stack(“testStack”);
…
}
分析定位堆栈信息
- 具体backtrace堆栈信息
#08 pc 0000000000002120 /system/lib64/libxxx_xxx_jni.so
#09 pc 00000000000024c4 /system/lib64/libxxx_xxx_jni.so (_ZN13TheftListener9OnCmdProcEtRKSt6vectorIhSaIhEE+280)
#10 pc 0000000000003b00 /system/lib64/libxxxservice_xxx.so (_ZN15SVPTheftService9OnCmdProcEtRKSt6vectorIhSaIhEE+1608) - 使用addr2line分析定位具体文件
在Android源码路径下,执行如下命令:
addr2line -ae out/target/product/xxx/obj/SHARED_LIBRARIEX/XXX/libxxx_xxx_jni.so 00000000000024c4
打印如下图,堆栈信息就能定位到某个文件的具体行数
如此一来, 能快速梳理 Android 项目中代码调用流程,并定位BUG 。
需要注意:
1,注意调试文件的位置在obj目录下,并非libs目录下生成的so文件
2,00000000000024c4为出错的机制位置