Android程序backtrace分析方法
如何分析Android程序的backtrace
最近碰到Android apk crash的问题,单从log很难定位。从tombstone里面得到下面的backtrace。
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Android/msm8996/msm8996:7.1.2/N2G47H/20180921.193127:userdebug/test-keys'
Revision: '0'
ABI: 'arm64'
pid: 2848, tid: 3158, name: Thread-5819 >>> com.company.package <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
x0 0000007fa5ae0a60 x1 0000000000000000 x2 0000000000000008 x3 0000000000000010
x4 0000000000000000 x5 c6a4a7935bd1e995 x6 c6a4a7935bd1e995 x7 0000000000000000
x8 0000007fa5ae0ab8 x9 0000007f8d4e2ac8 x10 0000000000000174 x11 0000000000000000
x12 0000007f8d4e2ac8 x13 ffffffffffffffff x14 0000000000000000 x15 003b9aca00000000
x16 0000007f98060850 x17 0000007fb69177c0 x18 0000000000000020 x19 0000007f97a12330
x20 0000007f870feb68 x21 0000007f870feb40 x22 0000000000000000 x23 0000007f7ef07ac0
x24 0000007f870fea78 x25 0000007f978c03a0 x26 0000007f870ff2f0 x27 0000007f870fea20
x28 0000007f870feba0 x29 0000007f870fe6f0 x30 0000007f9725f6c8
sp 0000007f870fe6f0 pc 0000007f9725f6c8 pstate 0000000080000000
v0 00000000000000000000000000000000 v1 00000000000000000000000000000000
v2 00000000000000000000000000000000 v3 00000000000000000000000000000000
v4 00000000000000004000000000000000 v5 00000000000000000000000000000000
v6 00000000000000000000000000000000 v7 00000000000000000000000000000000
v8 0000000000000000000000003ce0e100 v9 00000000000000000000000042ff0000
v10 0000000000000000000000003f800000 v11 00000000000000000000000000000000
v12 00000000000000000000000000000000 v13 00000000000000000000000000000000
v14 00000000000000000000000000000000 v15 00000000000000000000000000000000
v16 000000000000000000000000c307e06a v17 0000000000000000fffefffdfffdfffe
v18 0000000000000000fffffffefffeffff v19 000000000000000000ee00ee00ee00ee
v20 000000000000000000040003fffdfffc v21 000000000000000000ef00ef00ed00ec
v22 00000002000000020000000200000002 v23 00000000000000000000000000000148
v24 00000000000000000000000000000001 v25 00000000000000000000000000000029
v26 0000000000000000000000003e800000 v27 000000000000000000000000bf737871
v28 0000000000000000000000003f737871 v29 00000000000000000000007f8d52cf38
v30 00000000000000000000000000000140 v31 000000000000000000000000bfc4f8c4
fpsr 0000001b fpcr 00000000
backtrace:
#00 pc 00000000000a96c8 /system/app/Package/Package.apk (offset 0x5c1000)
#01 pc 00000000000b4574 /system/app/Package/Package.apk (offset 0x5c1000)
#02 pc 00000000000d52f0 /system/app/Package/Package.apk (offset 0x5c1000)
#03 pc 00000000000367ac /system/app/Package/Package.apk (offset 0xe0e000)
#04 pc 0000000000033070 /system/app/Package/Package.apk (offset 0xe0e000)
#05 pc 0000000000176910 /system/app/Package/Package.apk (offset 0xe0e000)
#06 pc 0000000000068618 /system/lib64/libc.so (_ZL15__pthread_startPv+196)
#07 pc 000000000001df68 /system/lib64/libc.so (__start_thread+16)
一看这个backtrace有点傻眼。通常得到的backtrace应该会打印出调用的so还有相应的函数名,这个不知道怎么回事只显示出apk的名字。调查了半天,怀疑是只有在apk是install的时候,才会有符号表的信息,出现有信息的打印。我们这个出现问题的时候,apk是编到rom里的,so库的符号表应该都被stip掉了。但是问题是这个crash很难重现,安装apk以后一直复现不了。好在这个apk自己只有三个so库,用addr2line试一试应该容易试出来。Android的sdk里自带了addr2line的工具,我们用的ndk13b版本,在windows上这个工具所在的目录是\Android\Sdk\android-ndk-r13b\toolchains\x86_64-4.9\prebuilt\windows-x86_64\bin,用-e参数指定文件名,-f参数显示函数名。果然,很容易就试出来是哪个so了。
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/Service/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libndk_camera.so -f 176910
execute_native_thread_routine
/usr/local/google/buildbot/src/android/ndk-r13-release/toolchain/gcc/gcc-4.9/libstdc++-v3/src/c++11/thread.cc:84
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/Service/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libndk_camera.so -f 33070
_ZNKSt7_Mem_fnIM12CameraEngineFvvEEclIJEvEEvPS0_DpOT_
C:/Users/qwang/AppData/Local/Android/Sdk/android-ndk-r13b/sources/cxx-stl/gnu-libstdc++/4.9/include/functional:569 (discriminator 4)
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/Service/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libndk_camera.so -f 367ac
_ZN12CameraEngine12ProcessFrameEv
C:\Users\qwang\StudioProjects\Service\package\app\src\main\cpp/camera_engine.cpp:525 (discriminator 2)
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/Service/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so -f d52f0
_ZN9OrionAlgo38vision_Algo_regressFacekeypointFromMatEN2cv3MatEiiii
C:\Users\qwang\StudioProjects\Service\package\app\src\main\cpp/OrionAlgo.cpp:107
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/Service/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so -f b4574
_ZN6vision13TrackStrategy13trackOrDetectERN2cv3MatEPNS_3SSDERSt6vectorI3BoxSaIS7_EEf
C:\Users\qwang\StudioProjects\Service\package\app\src\main\cpp\src\main\cpp\inference\postproc\src/track_strategy.cpp:38
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/Service/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so -f a96c8
_ZN6vision3SSD6detectERN2cv3MatERSt6vectorI3BoxSaIS5_EE
C:\Users\qwang\StudioProjects\Service\package\app\src\main\cpp\src\main\cpp\inference\algo\src/ssd.cpp:82
Android程序backtrace分析方法的更多相关文章
- Android APP性能分析方法及工具
近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借 ...
- android出现backtrace 定位方法
- 分析Android程序之破解第一个程序
破解Android程序通常的方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用ApkToo ...
- ZT Android Debuggerd的分析及使用方法
Android Debuggerd的分析及使用方法 分类: 移动开发 android framework 2012-12-28 12:00 983人阅读 评论(0) 收藏 举报 目录(?)[+] An ...
- 【Bugly干货分享】手把手教你逆向分析 Android 程序
很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...
- 在Eclipse中使用MAT分析Android程序内存使用状况(转)
对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题 ...
- 谈使用Eclipse与DDMS调试Android程序的方法
在Eclipse开发工具中调试程序的方法很多,但是使用Eclipse调试Android程序时需要注意一些细节上的问题.许多刚接触 Android的开发者,在调试Android程序时总是不能迅速地找到程 ...
- Android 内存泄漏分析与解决方法
在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...
- 用Ant手动打包android程序,android分包机制解决65536方法过多异常
Android利用ant手动打包 首先我们要给自己的IDE eclispe配置ant,默认的eclipse是集成了ant构建工具的,但是google提供的Android集成开发工具ADT,里面封装了E ...
随机推荐
- Angularjs 滚动条控制
控制滚动条 依赖 $location, $anchorScroll $scope.gotoTop = function () { $location.hash("top"); $a ...
- DIV+CSS详解
DIV+CSS详解 ✪DIV+CSS"这种叫法其实是一种不准确的叫法 在做笔记的最前面必须先给大家纠正一个错误,就是"DIV+CSS"这种叫法其实是一种不准确的叫法,是国 ...
- POJ-3660.Cow Contest(有向图的传递闭包)
Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17797 Accepted: 9893 De ...
- 大数据学习笔记5 - Spark
Spark是一个基于内存计算的大数据并行计算框架.所以,Spark并不能完全替代Hadoop,主要用于替代Hadoop中的MapReduce计算模型. 在实际应用中,大数据处理无非是以下几个类型: 复 ...
- mysql 函数介绍
含义 一组预先编译好的SQL语句集合,可以理解成批处理语句 提高代码的重用性 简化操作 减少了编译次数并且减少了和数据库服务器的连接次数, 提高了效率 区别 : 存储过程:可以有0个返回,也可以有多个 ...
- iframe和form表单实现ajax请求上传数据
form的target属性设置为iframe的name值时,表示提交到url后返回的数据显示到iframe区域 <form action="/upload.html" met ...
- React Native不同设备分辨率适配和设计稿尺寸单位px的适配
React Native中使用的尺寸单位是dp(一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp = 1px),而设计师使用的是px, 这两种尺寸如何换算呢? 官方提供了PixelRat ...
- jqgrid content-type datatype
jQuery('#jq2').jqGrid( { url: 'http://localhost:8080/api/RskPriceFactorTest/senario/0/detail', editu ...
- OO第二次作业总结
OO~第二次作业总结 连续三周的电梯作业结束了,总的来说这三次作业做的还算平稳,既没有被刀,也没有刀中别人.那么接下来开始谈谈我对这三次作业的认识. 一.设计策略 我三次作业的设计思路基本上是相同的, ...
- 在Java的Condition接口【唤醒全部线程】
在Java的Condition接口中,存在的几个方法跟Synchronized中的wait(),waitall(),wait(time ^),这个几个方法一一对应起来,但是在Lock.newCondi ...