addr2line定位so库crash位置信息

找到NativeCrash的关键堆栈信息

需要注意两个关键信息:

  • 发生crash的so文件名
  • 发生crash的内存地址

以下为截取的NativeCrash的关键日志信息示例:

native: #00 pc 002da1d3  /system/lib/libart.so 
native: #01 pc 0036f6ab  /system/lib/libart.so
native: #02 pc 0036be4d  /system/lib/libart.so
native: #03 pc 00029034  /data/app/xxx==/lib/arm/[你的so文件名].so 

找到 addr2line 的位置

[你的NDK的绝对路径]/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/
目录下,为方便使用可配置环境变量。

我这边是直接在zsh里配置的别名:

  • vi ~/.zshrc
  • 结尾添加别名配置:
    alias addr2line="[NDK的绝对路径]/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line"
    
    
  • source ~/.zshrc 使配置生效

找到 crash-so 的位置

根据堆栈信息确定crash发生在哪个so文件中,并于
[你的工程目录的绝对路径]/[你的module名称]/build/intermediates/cmake/debug/obj/armeabi-v7a/
目录中找到该so文件。

执行 addr2line 指令

// 已配置别名(0x1d7ff0用你的crash-address代替)
addr2line -f -e [你的工程目录的绝对路径]/[你的module名称]/build/intermediates/cmake/debug/obj/armeabi-v7a/libffmpeg-invoker.so 0x1d7ff0

// 未配置别名
[NDK的绝对路径]/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line -f -e [你的工程目录的绝对路径]/[你的module名称]/build/intermediates/cmake/debug/obj/armeabi-v7a/libffmpeg-invoker.so 0x1d7ff0

介绍上面使用 addr2line 时两个被使用的 option

  • -f --functions Show function names,显示当前行所在的函数名称
  • -e --exe= Set the input file name (default is a.out),该option后面需要跟随分析的so文件全路径
  • 其他option可运行 addr2line --help 自行查看

你可能感兴趣的:(JNI)