an introduction of google breakPad for android
一、背景
众所周知,Android JNI层的Crash问题是个比较头疼的问题。相对Java层来说,由于c/c++造成的crash没有输出如同
Java的Exception Strace,所以crash的定位问题是件比较艰难的事情。Google Breakpad是一套完整的工具集,从crash的
捕获到crash的dump,都提供了相对应的工具。
二、目的:当程序crash了之后,收集程序崩溃信息,定位到崩溃的地方
三、方案
Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合。
Breakpad由三个主要组件:
client,以library的形式内置在你的应用中,当崩溃发生时写 minidump文件
symbol dumper, 读取由编译器生成的调试信息(debugging information),并生成 symbol file
processor, 读取 minidump文件 和 symbol file ,生成可读的c/c++ Stack trace.
简单来说就是一个生成 minidump,一个生成symbol file,然后将其合并处理成可读的Stack trace。
四、集成
1.克隆或者下载breakpad开源库:https://github.com/google/breakpad.git
2.进入根目录执行:
`./configure && make`
src/client/linux目录下生成libbreakpad_client.a 静态库文件[libbreakpad_client.a](/uploads/33f43e7fad5ec0fa5358c5fc9373e1db/libbreakpad_client.a),src/processor 目录下生成
minidump_stackwalk 工具[minidump_stackwalk](/uploads/8b56c60770516b83344378e22ab64874/minidump_stackwalk),用于导出crash log,
src/tools/linux/dump_syms 目录下生成 dump_syms工具[dump_syms](/uploads/05ca888d36dd5dfe4b0927e881ae775c/dump_syms),用于导出符号文件。
3.集成的方式有两种, 参考breakpad目录下README.ANDROID。
注:这里直接使用sample_app,如需在app中使用,可以直接include sample_app中jin的android.mk文件
(1) 编译成成.a库文件, 直接用加入.a的方式来集成
(2) 使用import-module的方式, 让ndk来编译
这里采用第(2)种方式,详见sample_app目录下的jin中的android.mk文件[Android.mk](/uploads/bf07e5cc4ce46a87045203239a5eade4/Android.mk)
(1) 直接使用/android/sample_app的实例
(2) 在jni/Android.mk中加入代码
```
LOCAL_CPPFLAGS := -pie -fPIE -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
LOCAL_LDFLAGS := -pie -fPIE
```
注:详见sample-app文件夹下的jin文件夹下的android.mk
(3) 在main.cpp 中加入代码[test_breakpad.cpp](/uploads/6becceec0fad8db20eda02f623ef9866/test_breakpad.cpp)
#include <stdio.h>
#include "client/linux/handler/exception_handler.h"
#include "client/linux/handler/minidump_descriptor.h"
namespace {
bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor,void* context,
bool succeeded) {printf("Dump path: %s\n", descriptor.path());
return succeeded;
}
void Crash() {
volatile int* a = reinterpret_cast<volatile int*>(NULL);
*a = 1;
}
} // namespace
int main(int argc, char* argv[]) {
google_breakpad::MinidumpDescriptor descriptor("/sdcard");
google_breakpad::ExceptionHandler eh(descriptor, NULL, DumpCallback, NULL, true, -1);
Crash();
return 0;
}
此时, 就可以编译android cocos2d-x工程了, 生成的crash文件放在 /sdcard下, 文件后缀为dmp
五、测试
Build instructions:
```
cd android/sample_app
$ndk-build
```
Where $NDK points to a valid Android NDK installation.After executing "ndk-build"
,there will be many binary files named test_google_breakpad
Usage instructions:
After buildind the test program, send it to a device, then run it as
the shell UID:
adb push libs/armeabi/test_google_breakpad /data/local/tmp
adb shell /data/local/tmp/test_google_breakpad
ps:However, you don"t have do these two steps, in that our shell of 'run_test' already has included them.
This will simply crash after dumping the name of the generated minidump
file.[a1ee9a8a-21bc-4e2b-85046fab-20468514.dmp](/uploads/52f61416273700a479a323df4d382412/a1ee9a8a-21bc-4e2b-85046fab-20468514.dmp)
use the command of adb to pull the file of .dmp
See jni/test_breakpad.cpp for details.
六、结果分析
Note: all of the things you need do is that to use the command of adb to pull the file of .dmp and to analysis it.
在sample_app目录下新建Dump文件,拷贝命令dump_syms和minidump_stackwalk到Dump目录下。
```
cp breakpad-master/src/tools/linux/dump_syms/dump_syms ./Dump
cp breakpad-master/src/processor/minidump_stackwalk ./Dump
```
生成sym文件[test_google_breakpad.sym](/uploads/54fa8d709f89fa17e5ba027ce44dc7c1/test_google_breakpad.sym)
```
cd Dump
./dump_syms test_google_breakpad > test_google_breakpad.sym
```
注:在我们的APP中,test_google_breakpad在obj/local/armeabi-v7a目录下,需要将其copy到Dump目录下
在Dump中新建symbols文件夹,在symbols文件夹下新建test_google_breakpad文件夹,然后在
test_google_breakpad文件夹下新建以test_google_breakpad.sym文件中的第一行的十六进制字符串命名的文件
夹,将test_google_breakpad.sym移动到这个十六进制字符串的文件夹下。
生成crashed.log文件[crashed.log](/uploads/79a0fdf3aebf28307c9caf98dba1d559/crashed.log)
```
cd Dump
./minidump_stackwalk xxxx-xxxx-xxxxx-xxxx.dmp symbols > crashed.log
```
注:确保dmp文件和symbols目录是同级的
打开crashed.log文件,查看程序崩溃的地方
an introduction of google breakPad for android的更多相关文章
- Android使用google breakpad捕获分析native cash
Android 开发高手课 课后练习(1) 一.Chapter01 崩溃 https://time.geekbang.org/column/article/70602 https://github.c ...
- x86 Android游戏开发专题篇之使用google breakpad捕捉c++崩溃(以cocos2dx为例)
近期一直都在x86设备上进行游戏开发.就c++层和Android java层倒没有什么要特别注意的(除了须要注意一下改动Application.mk指定平台外),在c++崩溃的时候,非常多时候看不到堆 ...
- Google Breakpad: 实战crash .
Google Breakpad: 实战crash . http://blog.csdn.net/zm_21/article/details/24795205 C/C++程序最棘手的时候就是一个字“挂” ...
- C++库(Google Breakpad)
Google Breakpad是什么? 一个开源的多平台崩溃报告系统. Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,它支持Windows,Linux和Mac和Solari ...
- Google Developing for Android 三 - Performance最佳实践
Google Developing for Android 三 - Performance最佳实践 发表于 2015-06-07 | 分类于 Android最佳实践 原文 Developing ...
- Google Developing for Android 二 - Memory 最佳实践 // lightSky‘Blog
Google Developing for Android 二 - Memory 最佳实践 | 分类于 Android最佳实践 原文:Developing for Android, II Th ...
- Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具
Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具 记得我的第一篇博客就是写Android Studio,但是现在看来还是有些粗糙了,所有重构了一下思路, ...
- QT中使用google breakpad捕获程序崩溃异常
今天给大家介绍一个在linux下如何捕获程序崩溃异常的方法 一.google breakpad源码的下载和编译 1.https://github.com/google/breakpad.git,源码地 ...
- Google BreakPad使用集
Google Breakpad 学习笔记 - 简书 Qt中使用Google Breakpad捕获程序崩溃异常_Linux编程_Linux公社-Linux系统门户网站
随机推荐
- 使用 acl 编写 UDP 网络程序(UDP 重传及可靠性机制)
在当今网络世界,虽然大部分网络应用都是基于 TCP 的,但有时 UDP 的网络通信也有用武之处.acl 的网络库中不仅提供了基于 TCP 的网络套接字流,同时也提供了 UDP 的网络库(目前 acl ...
- 伪元素黑魔法:一个替代onerror解决图片加载失败的方案
问题的引出是这样的,在一个项目中有大量的页面主体是table做数据展示,所以就封装了一个table的组件,提供动态渲染的方案.有个问题是数据类型中有图片,对于图片的加载失败我们需要做容错.一般我们的思 ...
- 以太网,IP,TCP,UDP数据包分析(此文言简意赅,一遍看不懂的话,耐心的看个10遍就懂了,感谢作者无私奉献)
1.ISO开放系统有以下几层: 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 2.TCP/IP 网络协议栈分为应用层(Application).传输层(Tra ...
- 第二章 python如何运行程序
一.python解释器介绍 Python解释器是一种让程序运行起来的程序.实际上,解释器是代码与机器的计算机硬件之间的软件逻辑层.当Python包安装在机器上后,它包含了一些最小化的组件:一个解释器和 ...
- 16 input默认样式清除
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- JIRA的安装部署问题
JIRA的安装部署问题: 因电脑上装了两人系统,导致我的JIRA服务不能和tomcat同时启动,让我弄了好久都不知道是啥原因,经过请教,总算得出原来是JIRA的Port和Tomcat的Port冲突.在 ...
- js与原生进行交互
由于最近做的项目我作为web前端要和原生开发者合作,所以就去踩了踩坑. 这个功能是在h5页面上点击按钮关闭当前页面. function click_fn() { var u = navigator.u ...
- Java多线程学习(吐血超详细总结)
Java多线程学习(吐血超详细总结) 林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实 ...
- zabbix自定义监控项数据类型错误
问题描述 监控cpu使用率,脚本获取的值是浮点型 zabbix创建监控项时没有选数据类型,导致监控数据有问题. 查看 zabbix-server 日志: ::203016.768 error rea ...
- Python笔记【1】_字符串学习
#!/usr/bin/env/python #-*-coding:utf-8-*- #Author:LingChongShi #查看源码Ctrl+左键 #字符串:通常有单引号“'”.双引号“" ...