Google Breakpad之七,android平台简明用法

摘要:
1.编译静态库。解压缩并将breakpad源代码目录复制到项目中。编译:/configure--host=arm-linux-androideabimake-j2.生成的库是:src/client/linux/libbreakpad_client.a2.源代码中的include头文件:#include:client/llinux/handler/exception_handler.h”,然后在源代码中添加:#ifdefUSE_DUMP#ifdef__linux__//下面是linux下的声明方法。其他平台不同于Google_breakpad::MinidumpDescriptordescriptor(“/”);//dmp-google_breakpad::ExceptionHandlereh;#生成的目录endif#endifExceptionHandler的变量eh在作用域中有效。

google breakpad android简易使用方法:
breakpad是一个跨平台的c++崩溃处理系统。
包括:dmp生成模块、 上传模块、 服务器存储模块、解析dmp模块 等。

初级只使用dmp生成模块,再加上手动分析dmp即可。
1、编译静态库
解压并拷贝breakpad源码目录到项目中,编译:
./configure --host=arm-linux-androideabi
make -j2

生成的库是:
src/client/linux/libbreakpad_client.a

2、源码中include头文件:
#include "client/linux/handler/exception_handler.h"
然后在源码中加入:
#ifdef USE_DUMP
#ifdef __linux__//下面是linux下的声明方法,其他平台有所不同
google_breakpad::MinidumpDescriptor descriptor("/");//dmp生成的目录
google_breakpad::ExceptionHandler eh(descriptor,
NULL,
NULL,
NULL,
true,
-1);
#endif
#endif

ExceptionHandler的变量eh在作用域内有效。
比如在main的最开始就加上这两行,那么在整个程序生命周期的异常crash皆可被捕获。

3、修改Android.mk文件,通过USE_DUMP宏可控制是否生成带breakpad的项目版本

确保Application.mk里有APP_STL设置,STLport 或者 GNU libstdc++,然后
在 LOCAL_CFLAGS += \
最后加上一行-DUSE_DUMP
比如:
LOCAL_CFLAGS += \
-DANDROID_SDK \
-DUSE_DUMP

在LOCAL_STATIC_LIBRARIES := \
代码块后加上一行:

LOCAL_STATIC_LIBRARIES += breakpad_client

在mk文件末尾加上:
include ./jni/src/common/breakpad/android/google_breakpad/Android.mk

4、编译项目文件
ndk-build
注意obj文件夹里的项目文件是带符号信息的,lib文件夹里的不带,
所以cp出obj里的文件,部署到测试环境,程序死掉时会生成dmp文件。

5、dmp文件解析

把src/processor/minidump_stackwalk用adb push 到android设备上,比如/目录,然后chmod一下
src/tools/linux/dump_syms/dump_syms同上
解析dmp文件,比如test是我的项目文件,5ee28168-f798-caba-749b962b-312eaf19.dmp 是挂掉后的dmp文件
./dump_syms ./test > test.sym
busybox head -n1 test.sym
屏幕显示:
MODULE Linux arm 6EDC6ACDB282125843FD59DA9C81BD830 test
然后:
mkdir -p ./symbols/test/6EDC6ACDB282125843FD59DA9C81BD830
mv test.sym ./symbols/test/6EDC6ACDB282125843FD59DA9C81BD830
./minidump_stackwalk 5ee28168-f798-caba-749b962b-312eaf19.dmp ./symbols

屏幕显示堆栈信息:
Operating system: Linux
0.0.0 Linux 2.6.32-279.11.1.el6.x86_64 #1 SMP Tue Oct 16 15:57:10 UTC 2012 x86_64
CPU: amd64
family 6 model 42 stepping 7
1 CPU

Crash reason: SIGSEGV//挂掉类型
Crash address: 0x0

Thread 0 (crashed)//挂掉线程id
0 test!crash() [test.cc : 10 + 0x4]//代码: *a = 1; //a是一个int*的指针,值为NULL,给NULL赋值1,挂在源码的第10行,从左到右第四个字符的位置挂了,即a。
rbx = 0x00007fff6c4b8a90 r12 = 0x0000000000401a00
r13 = 0x00007fff6c4b8bc0 r14 = 0x0000000000000000
r15 = 0x0000000000000000 rip = 0x0000000000401b2d
rsp = 0x00007fff6c4b89e0 rbp = 0x00007fff6c4b89e0
Found by: given as instruction pointer in context
1 test!main [test.cc : 16 + 0x4]
rbx = 0x00007fff6c4b8a90 r12 = 0x0000000000401a00
r13 = 0x00007fff6c4b8bc0 r14 = 0x0000000000000000
r15 = 0x0000000000000000 rip = 0x0000000000401c29
rsp = 0x00007fff6c4b89f0 rbp = 0x00007fff6c4b8ae0
Found by: call frame info
2 libc-2.12.so + 0x1ecdc
rbx = 0x0000000000000000 r12 = 0x0000000000401a00
r13 = 0x00007fff6c4b8bc0 r14 = 0x0000000000000000
r15 = 0x0000000000000000 rip = 0x0000003d64e1ecdd
rsp = 0x00007fff6c4b8af0 rbp = 0x0000000000000000
Found by: call frame info
3 test!crash() [test.cc : 11 + 0x1]
rip = 0x0000000000401b35 rsp = 0x00007fff6c4b8b10
Found by: stack scanning

Loaded modules:
0x00400000 - 0x00412fff test ??? (main)
0x3d64a00000 - 0x3d64a1ffff ld-2.12.so ???
0x3d64e00000 - 0x3d6518dfff libc-2.12.so ???
0x3d65600000 - 0x3d65818fff libpthread-2.12.so ???
0x3d65a00000 - 0x3d65c83fff libm-2.12.so ???
0x3d6a600000 - 0x3d6a815fff libgcc_s-4.4.6-20120305.so.1 ???
0x3d6c600000 - 0x3d6c8f0fff libstdc++.so.6.0.13 ???
0x7fff6c4f9000 - 0x7fff6c4f9fff linux-gate.so ???

免责声明:文章转载自《Google Breakpad之七,android平台简明用法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[WPF开发] WPF中Listbox/ListView 横向展示/滑动内容的方法【记一次有关定时任务的问题】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据库创建,用户管理,导入dmp文件

创建数据库文件 CREATE TABLESPACE toolset LOGGING DATAFILE '/home/oracle/app/oracle/oradata/orcl/toolset.dbf' SIZE 100M AUTOEXTEND ON NEXT 32M MAXSIZE 500M EXTENT MANAGEMENT LOCAL; 创建数据库临...

oracle字符集的查看和修改

一、什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。 影响Oracle数据库字符集最重要的参数是NLS_LANG参数。 它的格式如...

如何在oracle中导入dmp数据库文件

如何在oracle中导入dmp数据库文件 --如何在oracle中导入dmp数据库文件                          Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 利用这个功能可以构...

IBM Cognos Business Intelligence Serverv10.1.1以及Samples for Oracle安装部署【转】

原文:http://blog.csdn.net/esrichinacd/article/details/8433333 上一篇文章介绍了IBM Cognos Business Intelligence开发版的安装和部署,但经过研究发现ESRI Maps For Cognos并不能安装在开发版上,所以才重新整理了企业版的安装和部署。 软件部署分为几个步骤...

记一次centos7挂在nas盘的踩坑经过

背景       xxxxxxxxxx       开发服务器磁盘空间不足,申请挂在nas存储.     处理流程 评估大小 给总部负责存储同事发邮件 登陆服务器挂在 踩坑经过 从申请到总部同事存储分配过程都很顺利 下面进行挂载 执行命令 [root@ovz-big-dmp-01 ~]# mount -t nfs 172...

Linux系统中imp导入dmp文件

[oracle@ocm1 ~]$ lltotal 32-rw-r--r-- 1 oracle oinstall 24576 Mar 27 15:26 COUNTRIES.dmpdrwxr-xr-x 2 oracle oinstall  4096 Mar 27 12:39 scriptdrwxr-xr-x 2 oracle oinstall  4096 Ma...