热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androidaddr2line用法,Androidstudio中NDK开发(四)——使用addr2line分析Crash日志

一、前言在NDK开发中经常会出现应用Crash的情况,而JNI层的报错信息,不像Java层报错信息那样可以直接在日志中看到错误的行数,JN

一、前言

在NDK开发中经常会出现应用Crash的情况,而JNI层的报错信息,不像Java层报错信息那样可以直接在日志中看到错误的行数,JNI层中出现的错误直接看根本定位不到错误的位置。通常来说,JNI报的基本都是堆栈信息,需要NDK的一些工具进行地址转换,转换后即可看到错误的位置。这些地址转换的工具有addr2line、ndk-stack等,我比较喜欢addr2line,平时也用这个工具进行调试。

二、分析

错误信息如下:

A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

A/DEBUG: Build fingerprint: 'xiaomi/mido/mido:7.0/NRD90M/V10.1.1.0.NCFCNFI:user/release-keys'

A/DEBUG: Revision: '0'

A/DEBUG: ABI: 'arm'

A/DEBUG: pid: 29290, tid: 29290, name: e.hasee.ndkdemo >>> com.example.hasee.ndkdemo <<<

A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------

A/DEBUG: r0 00000000 r1 0000726a r2 00000006 r3 00000008

A/DEBUG: r4 f6cbc590 r5 00000006 r6 f6cbc538 r7 0000010c

A/DEBUG: r8 12e45dc0 r9 f3f88000 sl ff90e8ec fp f3f88000

A/DEBUG: ip 00000058 sp ff90e5f8 lr f5c3a2c7 pc f5c3cb48 cpsr 200f0010

A/DEBUG: backtrace://堆栈信息&#xff0c;只需要关注这部分就好

A/DEBUG: #00 pc 00049b48 /system/lib/libc.so (tgkill&#43;12)

A/DEBUG: #01 pc 000472c3 /system/lib/libc.so (pthread_kill&#43;34)

A/DEBUG: #02 pc 0001d565 /system/lib/libc.so (raise&#43;10)

A/DEBUG: #03 pc 000190b1 /system/lib/libc.so (__libc_android_abort&#43;34)

A/DEBUG: #04 pc 00017114 /system/lib/libc.so (abort&#43;4)

A/DEBUG: #05 pc 0009063f /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN7GSMutex4LockEv&#43;90)

A/DEBUG: #06 pc 00090837 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN11GSAutoMutexC1ER7GSMutex&#43;10)

A/DEBUG: #07 pc 0004b4d7 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN12GSGB28181SDK9CSipStack18GetHistoryRegisterEv&#43;34)

A/DEBUG: #08 pc 0004b60b /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN12GSGB28181SDK9CSipStack13SendRegistMsgERK16_Stru_Regist_MsgjPc&#43;58)

A/DEBUG: #09 pc 000033a3 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libnative-lib.so (Java_com_example_hasee_ndkdemo_NDKUtil_agentRegister&#43;686)

1、先提取backtrace部分

上面的这些报错信息里面&#xff0c;backtrace部分显示的是错误的堆栈信息&#xff0c;所以我们只需要关注 backtrace部分就可以了。

提取后如下所示&#xff1a;

A/DEBUG: backtrace:

A/DEBUG: #00 pc 00049b48 /system/lib/libc.so (tgkill&#43;12)

A/DEBUG: #01 pc 000472c3 /system/lib/libc.so (pthread_kill&#43;34)

A/DEBUG: #02 pc 0001d565 /system/lib/libc.so (raise&#43;10)

A/DEBUG: #03 pc 000190b1 /system/lib/libc.so (__libc_android_abort&#43;34)

A/DEBUG: #04 pc 00017114 /system/lib/libc.so (abort&#43;4)

A/DEBUG: #05 pc 0009063f /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN7GSMutex4LockEv&#43;90)

A/DEBUG: #06 pc 00090837 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN11GSAutoMutexC1ER7GSMutex&#43;10)

A/DEBUG: #07 pc 0004b4d7 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN12GSGB28181SDK9CSipStack18GetHistoryRegisterEv&#43;34)

A/DEBUG: #08 pc 0004b60b /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN12GSGB28181SDK9CSipStack13SendRegistMsgERK16_Stru_Regist_MsgjPc&#43;58)

A/DEBUG: #09 pc 000033a3 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libnative-lib.so (Java_com_example_hasee_ndkdemo_NDKUtil_agentRegister&#43;686)

2、提取对应so库的信息

可以看到每一行最后面都跟着“xxx.so”信息

“#00” 至 “#04” 部分后面的都是 “/system/lib/libc.so” &#xff0c;这些都是系统的库&#xff0c;这个我们不需要管&#xff1b;

“#05” 至 “#09” 部分后面的so库都是我自己的&#xff0c;这些才是我们需要定位的部分。

“/data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so” // 引入的第三方so库

“/data/app/com.example.hasee.ndkdemo-2/lib/arm/libnative-lib.so ”// 编译生成的so库

将“#05” 至 “#09” 部分提取出来&#xff0c;如下所示&#xff1a;

A/DEBUG: #05 pc 0009063f /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN7GSMutex4LockEv&#43;90)

A/DEBUG: #06 pc 00090837 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN11GSAutoMutexC1ER7GSMutex&#43;10)

A/DEBUG: #07 pc 0004b4d7 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN12GSGB28181SDK9CSipStack18GetHistoryRegisterEv&#43;34)

A/DEBUG: #08 pc 0004b60b /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so (_ZN12GSGB28181SDK9CSipStack13SendRegistMsgERK16_Stru_Regist_MsgjPc&#43;58)

A/DEBUG: #09 pc 000033a3 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libnative-lib.so (Java_com_example_hasee_ndkdemo_NDKUtil_agentRegister&#43;686)

3、提取错误地址

剩下到的这几行中&#xff0c;重点看 “pc” 后面的十六进制数&#xff0c;这些是对应so库中的具体错误信息地址&#xff0c;这些地址才是我们最终需要转换的对象。为了更直观的展示&#xff0c;我把前面的“A/DEBUG” 和 “pc” 两个标签去掉&#xff0c;剩下行号还有地址以及so库部分提取出来。

提取如下所示&#xff1a;

#050009063f /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so

#0600090837 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so

#070004b4d7 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so

#080004b60b /data/app/com.example.hasee.ndkdemo-2/lib/arm/libthird.so

#09000033a3 /data/app/com.example.hasee.ndkdemo-2/lib/arm/libnative-lib.so

上面就是最终我们需要关注的部分&#xff0c;有了十六进制地址值以及后面的so库&#xff0c;下面我们就可以使用addr2line进行地址转换了。

三、使用addr2line对地址进行转换

1、addr2line工具的路径放在

" ${NDK} / toolchains / ${ABI} / prebuilt / windows-x86_64 / bin / "下

${NDK} // 你的NDK解压包路径

${ABI} // 你的调试设备的CPU架构,通常来说实体机一般都是对应 arm-linux-androideabi

2、Terminal中转换地址的命令

arm-linux-androideabi-addr2line -C -f -e ${SOPATH} ${Address}

-C -f //打印错误行数所在的函数名称

-e //打印错误地址的对应路径及行数

${SOPATH} //so库路径

${Address}//需要转换的堆栈错误信息地址&#xff0c;可以添加多个&#xff0c;但是中间要用空格隔开

四、例子

对上面最终提取的错误信息(“#05 – #09”)中的堆栈地址进行转换

1、首先找到自己的so库路径

对于“#05” 至 “#08” 部分的地址&#xff0c;我对应的so库路径为

F:/Android/workspace/NDKDemo/app/src/main/jniLibs/armeabi-v7a/libthird.so

对于“#09”行中的地址&#xff0c;我对应的so库为&#xff1a;

F:/Android/workspace/NDKDemo/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so

2、在Terminal中输入命令

对于“#05” 至 “#08” 部分的地址&#xff0c;我输入的命令为&#xff1a;

arm-linux-androideabi-addr2line -C -f -e F:/Android/workspace/NDKDemo/app/src/main/jniLibs/armeabi-v7a/libthird.so 0009063f 00090837 0004b4d7 0004b60b

对于“#09”行中的地址&#xff0c;我输入的命令为&#xff1a;

arm-linux-androideabi-addr2line -C -f -e F:/Android/workspace/NDKDemo/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so 000033a3

注意&#xff1a;

1)我这里已经将addr2line配置到环境变量中&#xff0c;所以可以直接使用arm-linux-androideabi-addr2line命令。如果没有配置的话&#xff0c;记得要加上自己的完整路径,否则会出现Terminal报错&#xff1a;

“&#39;arm-linux-androideabi-addrline2&#39; 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。”

2)要看清楚后面的so库&#xff0c;我这里第三方的so库和我自己的编译打包的so库都有报错地址信息&#xff0c;所以转换地址的时候&#xff0c;要注意地址后面对应的是哪个so库&#xff0c;不然的话会转换失败&#xff0c;转换的地址显示为 " ? ? 0 “(一个so库的错误地址信息跑到另外一个so库去查&#xff0c;当然查不到&#xff0c;除非两个错误位置在两个so库中的堆栈地址相同&#xff0c;查不到的时候&#xff0c;就会输出” ? ? 0 ")这个问题也困扰了我一个上午&#xff0c;要特别注意。

3)libnative-lib.so是我自己打包编译的库&#xff0c;自己打包编译的so库可以在Project视图的

" ./app/build/intermediates/cmake/debug/obj/&{ABI}/ " 路径下找到

d9e29a950ef039e68c00ba1e4741225e.png

3、效果

第三方libthird.so库的显示信息

d2204f6f7cbff92f2e079d9352092cfc.png

自己编译的libnatve-lib.so库的显示信息

1e30259e8916056b4a2948b97bac2455.png

点击一下转换后的地址就可以跳转到错误的位置了。

如有错误&#xff0c;欢迎指正&#xff0c;虚心学习&#xff01;



推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 腾讯T3大牛亲自教你!2021大厂Android面试经验,经典好文
    本篇将由环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来等七个方面,对当前的ReactNative和Flutter进行全面的分析对比, ... [详细]
  • Howtobuilda./configure&&make&&makeins ... [详细]
author-avatar
穿靴子的猫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有