当前位置: 首页 > 编程日记 > 正文

android 抓取native层奔溃

使用android的breakpad工具

使用这个工具需要下载Breakpad的源码,然后进行编译,编译之后会生成两个工具

我们使用这两个工具来解析奔溃的位置。这里我们可以下载已经编译好的工具

下载地址是:链接:http://pan.baidu.com/s/1jIiU5cq 密码:wy6f

你把对应的工具下载完成后需要上传到对应的linux环境下才能使用

二、生成转换工具
1、下载BreakPad源代码
命令行输入:svn checkout http://google-breakpad.googlecode.com/svn/trunk/ google-breakpad-read-only

2、编译工具
①进入代码路径
cd google-breakpad-read-only/


②配置环境
./configure


③编译工具
make


3、看看以下工具是否存在:
google-breakpad-read-only/src/tools/linux/dump_syms/dump_syms
google-breakpad-read-only/src/processor/minidump_stackwalk

这两个工具可以直接到csdn中去下载编译成功的

这个过程你需要编译出几个工具:minidump_stackwalk dump_syms等等

就是上面这两个工具

但是这里要注意不同的版本不一样,这里可以直接到csdn上去下载

集成到App中

使用开源的:https://github.com/yinyinnie/breakpad-for-android,它已经将对应的抓取奔溃的so库已经生成好了你只需要将对应的breakpad moudle引入到你的工程中就可以了

我们的工程依赖breakpad 这个模块

接下来我们来看看工程的代码:

调用的时候你只需要调用:  NativeBreakpad.init("/sdcard/Android/data/com.cetcs.ecmapplication/");

就可以,其中init中的参数就是奔溃日志存储的路径

当产生奔溃的时候会在该路径下面产生一个dmp的文件。有了dmp文件我们需要将dmp文件使用上面产生的两个工具来进行解析

得到奔溃的日志信息

我们新建了一个Dump文件夹

将上面的两个工具上传上去,必须保证上面的两个工具具有可以执行的权限

把奔溃的日志上传上去,保证奔溃的dmp文件具有可执行权限

把运行的si库文件上传上去,这里上传的so库必须需要具有调试信息:

对应android studio而言,这里需要上传的so库不是src/libs目录下的so库,而是必须具有调试信息的so库

具有调试信息的so 库在/local/目录下

使用ndk-build编译出来的so 库需要具有调试信息,so库存在的目录如下所示:

libs是正式提供给第三方使用的,obj目录下的so库才是具有调试信息的,所以具有调试信息的so库在发布版本的时候,我们需要进行备份

具体的操作步骤看博客:http://blog.csdn.net/brook0344/article/details/20126351

这里我实验了好多天:解析出来的dmp文件好像都没有和符号文件关联起来,不能得到下面的信息:

12-14 14:24:18.369  3281  3281 F DEBUG   : backtrace:12-14 14:24:18.369  3281  3281 F DEBUG   :     #00 pc 00000c98  /data/app/logback.ecmapplication.cetcs.com.testbreakpad-2/lib/arm/libweiyuan.so (sb_crash+3)12-14 14:24:18.369  3281  3281 F DEBUG   :     #01 pc 00000ca1  /data/app/logback.ecmapplication.cetcs.com.testbreakpad-2/lib/arm/libweiyuan.so (Java_logback_ecmapplication_cetcs_com_testbreakpad_MainActivity_getStringFromC+4)12-14 14:24:18.369  3281  3281 F DEBUG   :     #02 pc 000ec389  /system/lib/libart.so (art_quick_generic_jni_trampoline+40)

得到的文件内容如下:

Operating system: Android0.0.0 Linux 3.10.86-g8b38b32 #1 SMP PREEMPT Thu Apr 14 14:24:52 CST 2016 armv7l
CPU: armARMv1 ARM part(0x4100d080) features: half,thumb,fastmult,vfpv2,edsp,neon,vfpv3,vfpv4,idiva,idivt8 CPUsGPU: UNKNOWNCrash reason:  SIGSEGV
Crash address: 0x0
Process uptime: not availableThread 0 (crashed)0  libweiyuan.so + 0xc98r0 = 0xf43d6cc0    r1 = 0xffcf371c    r2 = 0x00000001    r3 = 0x00000000r4 = 0xf43d6cc0    r5 = 0xffcf3cb0    r6 = 0x0000004c    r7 = 0xffcf37d0r8 = 0xef5251c8    r9 = 0xf43f6500   r10 = 0xffcf3720   r12 = 0xef50bc9dfp = 0xf43f6500    sp = 0xffcf36f8    lr = 0xef50bca5    pc = 0xef50bc98Found by: given as instruction pointer in context1  dalvik-LinearAlloc (deleted) + 0x151c6sp = 0xffcf36fc    pc = 0xef5251c8Found by: stack scanning2  libart.so + 0xec389sp = 0xffcf3700    pc = 0xf3fb638bFound by: stack scanning3  dalvik-main space 1 (deleted) + 0x1e40esp = 0xffcf3704    pc = 0x32c1e410Found by: stack scanning4  dalvik-main space 1 (deleted) + 0x1e3fesp = 0xffcf3708    pc = 0x32c1e400Found by: stack scannin

只能得到一个c98,这个时候有啥办法可以直接定位出来没

这个时候可以使用arm-linux-androideabi-addr2line.exe这个工具来进行定位,具体不清楚的看博客http://blog.csdn.net/xyang81/article/details/42319789

我们首先进入到工程中具有调试信息so 库所在的目录:目录的路径如下所示:

C:\TestGoogleBreakPad\app\build\intermediates\ndk\debug\obj\local\armeabi-v7a

我们使用下面的命令:

D:\android_sdk_ndk\android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line.exe  -C -f -e ./libweiyuan.so 00000c98

其中:D:\android_sdk_ndk\android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line.exe 是对应的arm-linux-androideabi-addr2line工具的路径

00000c98就是对应的so 库奔溃对应的堆栈位置

我们来看一下

我们可以看出对应的奔溃信息是在:Java_logback_ecmapplication_cetcs_com_testbreakpad_MainActivity_getStringFromC这个c文件的第12行发生了奔溃

第12行就是*a =1,*a是一个无效的野指针,给野指针赋值就会导致内存奔溃

我们来看看这个c文件的代码:

//
// Created by wei.yuan on 2017/11/13.
//
#include<jni.h>
#include<logback_ecmapplication_cetcs_com_testbreakpad_MainActivity.h>
#include <jni.h>
#include <string.h>
#include <pthread.h>void sb_crash(){int *a = (int *) (NULL);*a = 1;
}
JNIEXPORT jstring JNICALL Java_logback_ecmapplication_cetcs_com_testbreakpad_MainActivity_getStringFromC(JNIEnv * env, jobject obj){sb_crash();return (*env)->NewStringUTF(env,"I'm comes from 444444to Native Function!");
}

我们来看看整个工程的目录架构如下所示:

特别需要注意的地方:

1、不同的breakpad版本的源码编译出来的上面的两个工具可能不一样,这样对dmp文件进行解析,解析出来的结果可能存在问题;

2、使用功能进行解析的时候,需要使用具有调试信息的so库文件,所以每次发版本的时候,需要将具有调试信息的so库文件进行备份;

3、如果解析dmp文件得不到具有的那个函数奔溃,没有和符号文件关联起来,可以使用\arm-linux-androideabi-addr2line.exe对具体调试信息的so库文件进行定位,这样也可以得到具体的行数

4、对应android 6.0以上的操作系统,存储奔溃文件需要动态申请,一定要保存app的存储权限已经开启,否则在对应的目录下没有对应的奔溃文件

整个android studio工程的代码如下:

http://pan.baidu.com/s/1ge9iKQf

相当的经典

集成:

在ecms集成breakPad模块的时候报错:


上面ecmcommon这个模块依赖breakpad模块
需要注意几点:
第一:breakpad模块中在gradle配置文件中
defaultConfig {
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}
必须和ecmcommon模块中对应
 minSdkVersion 16
targetSdkVersion 23
一一对应

第二:要在ecmmmon对应的minifimest清单文件中添加
tools:replace="android:allowBackup"
这句话
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.cetcs.ecmcommon">

<application android:allowBackup="false"
android:label="@string/app_name"
android:supportsRtl="true"
tools:replace="android:allowBackup"
>

</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
</manifest>

不清楚的参看博客:https://www.jianshu.com/p/a3c3532f4d30

集成方式二:

集成到App

  1. 拷贝.so文件到你项目的app/libs/
  2. 拷贝sample/breakpad/src/main/java/cn/onlinecache/breakpad/NativeBreakpad.java到你的工程目录下,注意:包名不能改哦!!
  3. 在你的Application类初始化:NativeBreakpad.init(Environment.getExternalStorageDirectory().getAbsolutePath()); 注意:这个方法所传的参数你可以直接定义

你也可以无需编译,直接使用sample的breakpad module

如果集成好了有打印:

01-18 13:00:39.085 24480-24480/com.cetcs.ecmapplication D/cn.onlinecache.breakpad: nativeInit ===> breakpad initialized succeeded, dump file will be saved at /sdcard/Android/data/com.cetcs.ecmapplication/
01-18 13:00:39.628 24510-24510/? D/cn.onlinecache.breakpad: nativeInit ===> breakpad initialized succeeded, dump file will be saved at /sdcard/Android/data/com.cetcs.ecmapplication/

如何抓取到奔溃日志有打印:

-18 13:03:35.127 25292-25292/com.cetcs.ecmapplication E/cn.onlinecache.breakpad: native crash capture begin
01-18 13:03:35.246 25292-25292/com.cetcs.ecmapplication E/cn.onlinecache.breakpad: DumpCallback ===> succeeded 1

如果日志上出现

DumpCallback ===> succeeded 0

0表示native奔溃日志没有抓取成功



转载于:https://www.cnblogs.com/kebibuluan/p/7811133.html

相关文章:

渗透各行各业,这家RPA外企宣布全面进军中国市场

11月15日&#xff0c;全球机器人流程自动化&#xff08;RPA&#xff09;领域平台UiPath首次在中国举办UiPath Together年度大会&#xff0c;来自自动化、人工智能和机器学习领域的行业专家&#xff0c;以及来自中国和世界的领先公司的客户与合作伙伴共同参与了此次活动。在此次…

java gettext_JAVA中getText()怎么从一个JTextArea中读出内容?

想先创建一个JTextArea&#xff0c;然后在里面输入内容(几个字母)&#xff0c;然后用getText读出里面的内容&#xff0c;可是好像只能是先在JTextArea里面写&#xff0c;然后getText才能读出&#xff0c;而不能先运行&#xff0c;在图形界面的JTex...想先创建一个JTextArea&…

想在SqlDbHelper.cs类中加的垃圾方法

虽然没改写SqlDbHelper.cs类的能力&#xff0c;但好不容易想出来的&#xff0c;放着留个纪念~~~~~/**//// <summary> /// 执行SQL语句&#xff0c;返回第一行&#xff0c;第一列&#xff08;sea&#xff09; /// </summary> /// <param na…

java全站_javaWeb_全站编码

目的 : 实现javaweb项目的全站编码问题需要解决的问题 : 在何时进行编码问题的解决, 在何处进行编码问题的解决, 才用什么方法进行解决设计思路 : 在Filter进行全站的编码转换, 对于GET请求 : 使用装饰者模式(是你有你一切拜托你), 修改Request.getParameter()方法, 在getparam…

在Linux系统中修改目录的权限如何恢复

在我工作中的某一天执行了chmod -R 777 /home后我十分后悔&#xff0c;这下不知道该怎么办&#xff1f;心里面很是着急。此时灵机一动问了一下谷哥&#xff0c;终于找到了方法解决此问题&#xff0c;不过前提是要自己做了文件权限备份工作&#xff0c;现在我就给大家讲解一下我…

.Net Framework 3.5 结构图

从打印社用A0或A1的纸打出来&#xff0c;大概10RMB&#xff0c;看起来超爽。 转载于:https://www.cnblogs.com/habin/archive/2008/03/15/1107196.html

关于CVPR 2019投稿的一些感想

作者 | 胡国圣&#xff0c;英国 anyvision 高级研究员&#xff0c;从事深度学习&#xff0c;人脸识别的研究。一年一度的 CVPR 是人工智能的机器视觉方向最重要的学术会议&#xff0c;每年吸引都会全球最顶尖的大学和公司的研究人员投稿&#xff0c;文章如果被录用&#xff0c;…

ORACLE 数据泵导入导出数据

一、摘要 在平常备库和数据库迁移的时候&#xff0c;当遇到大的数据库的时候在用exp的时候往往是需要好几个小时&#xff0c;耗费大量时间。oracle10g以后可以用expdp来导出数据库花费的时间要远小于exp花费的时间&#xff0c;而且文件也要小很多。 二、exp/imp与expdp/impdp区…

java备忘录模式应用场景_图解Java设计模式之备忘录模式

图解Java设计模式之备忘录模式游戏角色状态恢复问题游戏角色有攻击力和防御力&#xff0c;在大战Boss前保存自身的状态(攻击力和防御力)&#xff0c;当大战Boss后攻击力和防御力下降&#xff0c;从备忘录对象恢复到大战前的状态。传统方案解决游戏角色恢复传统的方式的问题分析…

一文掌握常用的机器学习模型(文末福利)

AI 科技大本营按&#xff1a;本文节选自微软亚洲研究院机器学习研究团队刘铁岩、陈薇、王太峰、高飞合著的《分布式机器学习&#xff1a;算法、理论与实践》一书。为了让大家更好地理解分布式机器学习&#xff0c;AI科技大本营联合华章科技特别邀请到了本书的作者之一——微软亚…

MYSQL替换语句

update dede_art set titlereplace(title, <IMG border0 srcImages/hot.gif>,);update 表名(比如我案例中的dede_art) set 要修改字段名 replace (要修改字段名,被替换的特定字符,替换成的字符) SELECT * FROM supe_spaceitems where subject like %狐狸天空% update …

phpstudy+phpstorm+debug

文:phpstudyphpstormdebug 一、配置前说明&#xff1a; 1、phpStudy集成了XDebug扩展&#xff0c;所以不用单独下载XDebug。 2、打开XDebug扩展&#xff1a;其它选项菜单 > PHP扩展 > Xdebug 二、配置步骤&#xff1a; 1、phpStudy当前版本&#xff1a; 2、修改php.ini…

java 卖票问题_Java之多线程窗口卖票问题(Thread)

/**** 例子&#xff1a;创建三个窗口卖票&#xff0c;总票数为100张.使用继承Thread类的方式** 存在线程的安全问题&#xff0c;待解决。**/class Window extends Thread{private static int ticket 100;Overridepublic void run() {while(true){if(ticket > 0){System.out…

雷军深情告白:在我心里,武汉大学是全球最好的大学

武汉大学将在 11 月 29 迎来 125 周年校庆&#xff0c;作为杰出校友&#xff0c;小米创始人雷军参加了昨天举行的第五届校友珞珈论坛。现场&#xff0c;雷军对武大深情表白&#xff1a;“马云在几个场合说过&#xff0c;杭州师范大学在他心里是全球最好的大学&#xff0c;没有之…

java中抽象接口_一篇文章让你彻底理解java中抽象类和接口

相信大家都有这种感觉&#xff1a;抽象类与接口这两者有太多相似的地方&#xff0c;又有太多不同的地方。往往这二者可以让初学者摸不着头脑&#xff0c;无论是在实际编程的时候&#xff0c;还是在面试的时候&#xff0c;抽象类与接口都显得格外重要&#xff01;希望看完这篇博…

linux proc

/proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的&#xff0c;而是能够在整个系统范围的上下文中使用。可以使用的文件随系统配置的变化而变化。 /proc/cmdline 这个文件给出了内核启动的命令行。 /proc/cpuinfo 这个文件提供了有关系统CPU的多种信息。 /proc/d…

专访英特尔AIPG全球研究负责人Casimir Wierzynski:物理学、隐私和大脑将根本性塑造AI

出品| AI 科技大本营 在 11 月 14 日至 15 日在北京召开的英特尔人工智能大会&#xff08;AIDC&#xff09;上&#xff0c;英特尔人工智能产品事业部&#xff08;AIPG&#xff09;全球研究负责人 Casimir Wierzynski 发表了主题为《人工智能研究——物理学、隐私和大脑》的演讲…

微软OOXML申请国际文档标准已获通过 中国投反对票

51CTO.com北京时间3月28日中午通过消息灵通人士获悉&#xff0c;微软新一代文档标准OOXML已经获得国际标准化组织&#xff08;ISO&#xff09;的通过。中国依然投反对票。 ISO共有104个成员&#xff0c;其中包括41个技术能力强、参与标准化活动多的“P成员”。若微软文档标准想…

java中的匿名类方法覆盖_Java技巧:用匿名类来实现简化程序调试

Java技巧&#xff1a;用匿名类来实现简化程序调试在Java中&#xff0c;匿名类(Anonymous inner classes)多用来处理事件(event handle)。但其实&#xff0c;它们对于debug也很有帮助。本文将介绍如何利用匿名类来简化你的debug。我们该如何调试那些非自己源码的方法调用呢&…

记录第一次在egret项目中使用Puremvc

这几天跟着另一个前端在做一个小游戏&#xff0c;使用的是egret引擎和puremvc框架&#xff0c;这对于我来说还是个比较大的突破吧&#xff0c;特此记录下。 因为在此项目中真是的用到了mvc及面向对象编程&#xff0c;值得学习 记录第一次在egret项目中使用Puremvc&#xff1a; …

使用CSS制作圆角效果

Web2.0中&#xff0c;圆角效果是很常见的&#xff0c;以前都是用图片来模仿&#xff0c;现在直接用css就能实现&#xff0c;例子代码如下 Html代码&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> &…

知识图谱升温之势已现,不要错失下一个AI风口

近年来&#xff0c;随着大家对高级认知能力的积极探索&#xff0c;知识图谱因为表达能力强&#xff0c;扩展性好&#xff0c;并能兼顾人类认知与机器自动处理&#xff0c;引起了学术界、工业界以及政府部门的高度关注。 最先被大家熟知的应用领域应属搜索引擎&#xff0c;为了…

干货 | 谷歌BERT模型fine-tune终极实践教程

作者 | 奇点机智从11月初开始&#xff0c;Google Research就陆续开源了BERT的各个版本。Google此次开源的BERT是通过TensorFlow高级API—— tf.estimator进行封装(wrapper)的。因此对于不同数据集的适配&#xff0c;只需要修改代码中的processor部分&#xff0c;就能进行代码的…

java简介 ppt 精_《JAVA》5选择结构精篇课件.ppt

《JAVA》5选择结构精篇课件选 择 结 构 if 语句 if – else语句 Switch语句 块作用域语句又被称为复合语句&#xff0c;其格式为&#xff1a;用一对花括号将若干条语句括起来&#xff0c;目的是从语法上可以将多条语句解释成一条语句。 { int temp; temp a; a b; …

UPDATE STATISTICS 有何妙用?

txlicenhe 马可 一直没有关注它&#xff0c;今天刚学到的一招&#xff0c;还没彻底弄清楚。 情况是这样&#xff0c;有一个视图&#xff0c;用到了好几个表&#xff0c;其中一个表改了一些资料&#xff0c;在前台操作时总是超时过期&#xff08;前台设置超时时间不长 60s&#…

js with用法

1&#xff09;简要说明 with 语句可以方便地用来引用某个特定对象中已有的属性&#xff0c;但是不能用来给对象添加属性。要给对象创建新的属性&#xff0c;必须明确地引用该对象。 2&#xff09;语法格式 with(object instance) { //代码块 } 有…

大数据时代,谁的眼神锁定你?

数据时代当前&#xff0c;欢迎来到楚门的世界。双十一余韵未歇&#xff0c;刚处理完一波售后及退件等“剁手后遗症”的各方人马也已经为再战双十二做好了准备。截至 12 日零点&#xff0c;天猫双十一成交额达 2135 亿元。与此同时&#xff0c;据国家邮政局监测数据显示&#xf…

Java类Demo中存在_Java中的数据类型转换

先来看一个题&#xff1a;Java类Demo中存在方法func0、func1、func2、func3和func4&#xff0c;请问该方法中&#xff0c;哪些是不合法的定义&#xff1f;( )public class Demo{float func0(){byte i1;return i;}float func1(){int i1;return;}float func2(){short i2;return i…

Exchange2000需要创建的3个SMTP服务实例

前一阵搞了邮件系统的安全加固&#xff0c;前面说的SA是一个方面&#xff0c;总觉得在SMTP上还有文章可做。分析一下公司的系统环境&#xff0c;SMTP的访问大概分这么三类&#xff1a;1、来自客户端的访问。2、来自公司业务系统服务器的访问。3、来自外部其它邮件服务器的访问。…

小程序门店自提功能开启,酷客多带你玩转O2O模式

目前小程序的发展已经如火如荼&#xff0c;不管是新型行业还是传统行业&#xff0c;都进军小程序领域&#xff0c;由此为广大消费者带来了方便与快捷&#xff0c;现在许多商家品牌将线上线下结合互动起来&#xff0c;推广门店自提的模式&#xff0c;酷客多小程序&#xff08;ht…