作者:HU

转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4037268.html

一、基本步骤

1、生成转换工具

2、把breakpad加入到项目

3、生成*.dmp文件(上传服务器)

4、使用之前生成的工具转化*.dmp文件成可识别的文本。

二、生成转换工具

1、下载BreakPad源代码(现在google被和谐了,找了个免费的VPN下下来。PS:一直都在用baidu会不会被鄙视)
     svn checkout http://google-breakpad.googlecode.com/svn/trunk/ breakpad

2、生成工具dump_syms和minidump_stackwalk,IOS和android稍有区别

①进入代码路径
      cd breakpad
    ②配置环境
      ./configure 
    ③编译工具
      make

android在Linux环境,IOS的在MAC环境执行。

android:dump_syms,在breakpad/src/tools/linux/dump_syms/dump_syms

minidump_stackwalk,在breakpad/src/processor/minidump_stackwalk

 IOS:dump_syms:需要使用xcode打开google-breakpad-read-only/src/tools/mac/symupload.xcodeproj,编译出来。

需要注意的是编译会出现几个错误:1.Architectures中的SDKROOT 改成Latest OS X(OS X 10.x)

2.因为 C++11 把关键字typeof改为decltype了所以linux_dumper.h和enteir_wrapper.h中要全部替换。

minidump_stackwalk,在breakpad/src/processor/minidump_stackwalk

三、把breakpad加入到项目

  IOS:1. 一种方法是:把/breakpad/src/client/ios/Breakpad.xcodeproj, 然后TARGETS->Build Phasesk中,Target Dependencies中加入Breakpad,Link Binary With Libraries中加入libBreakpad.a

    另一种方法是:直接把上面make时生成的breakpad/src/libBreakpad.a加入工程。

2.在Build Settings->Header Search Paths中加入breakpad的路径,  info.plist中加入

        <key>BreakpadURL</key>
<string>upload URL</string>
<key>BreakpadReportInterval</key>
<string>30</string>

URL就是上传服务器的地址。

3.AppController.mm中加入#import "client/ios/BreakpadController.h"

didFinishLaunchingWithOptions中加入

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    [[BreakpadController sharedInstance]start: YES];
    [[BreakpadController sharedInstance] setUploadingEnabled:YES];//设置是否上传
   window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
    ......
 
    ......
 
    
   return YES;

applicationWillTerminate 中加入

- (void)applicationWillTerminate:(UIApplication *)application {
    /*
     Called when the application is about to terminate.
     See also applicationDidEnterBackground:.
     */
    [[BreakpadController sharedInstance]stop];
}

android:1、一种方法是:直接把上面make时生成的src/client/linux/libbreakpad_client.a加入,具体方法和加入其它.a相同(这个方法我自己没试过)。

另一种方法:先修改/breakpad/android/Android.mk中少两个文件链接不过去,LOCAL_SRC_FILES中增加

client/linux/dump_writer_common/thread_info.cc \

client/linux/dump_writer_common/ucontext_reader.cc \

              2、因为到时代码我是加入到javaactivity.cpp中的,所以我找到/cocos2d/cocos/platform/android/Android.mk中加入LOCAL_WHOLE_STATIC_LIBRARIES最后面加上breakpad_client,在文件最后加上$(call import-module,breakpad/client/android),(路径自己注意)

3、javaactivity.cpp中加入#include "breakpad/client/linux/handler/exception_handler.h"(路径自己注意)

                                         

jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
JniHelper::setJavaVM(vm); google_breakpad::MinidumpDescriptor descriptor("/sdcard/test");//生成dump文件路径自己设定,test目录之前设置好。
handler = new google_breakpad::ExceptionHandler(descriptor,NULL,NULL,NULL,true,-); return JNI_VERSION_1_4;
}

四、生成*.dmp文件(如果服务器地址配置正确直接就能上传服务器了)

  为了测试,模拟一个崩溃。在cocos2dx中helloworld 加入

void HelloWorld::menuCloseCallback(Ref* pSender)
{int *i = NULL;
*i = ;
return;
}

此时,只要在helloworld那个例子中按退出那个按钮,程序就会崩溃退出(IOS下调试时好像不能生成,直接编好后再直接运行)。

然后在IOS下在/Library/Caches目录生成XXXXXX-XXXXX-XXX-XXXX.dmp,注意xcode6中模拟器的目录变了/Users/xxxxx/Library/Developer/CoreSimulator

android在之前设置的/sdcard/test/中(目录必须先建好,否则可能不能生成成功)。

五、使用之前生成的工具转化*.dmp文件成可识别的文本

IOS下,在MAC环境中(貌似是必须,没试过linux环境)

1、为了方便我们建一个文件夹,就叫crash好了,然后把minidump_stackwalk、dump_syms、92216F16-A538-461F-99FE-B1CB2C99AC1C.dmp(假设的dmp文件),test.app.dSYM(假设工程名为test)

2、./dump_syms test.app.dSYM > test.sym

       在生成的testcpp.sym中记事本打开第一行看到:MODULE mac armv7 1FA72B1E07FD36DAB327A300E7AC86450 test

3、使用那一串字符串执行下面命令

      mkdir -p symbols/test/1FA72B1E07FD36DAB327A300E7AC86450

mv test.sym symbols/test/1FA72B1E07FD36DAB327A300E7AC86450

4、最后使用得到的dump文件

./minidump_stackwalk 92216F16-A538-461F-99FE-B1CB2C99AC1C.dmp ./symbols > crashed.log

5、可以看到错误在哪了如图(在HelloWorldScene.cpp的第531行的HelloWorld::menuCloseCallback(cocos2d::Ref*)方法)
                 

android的话,必须在linux环境下使用。

1、和IOS一样为了方便我们建一个文件夹,就叫crash好了,然后把minidump_stackwalk、dump_syms、4b09b77b-0b49-e55f-11afa2c2-3d4c4ead.dmp(假设的dmp文件),libcocos2dcpp.so(这里必须使用/proj.android/obj/local/armeabi下生成的)

2、./dump_syms libcocos2dcpp.so > libcocos2dcpp.so.sym     

            使用busybox head -n1 libcocos2dcpp.so.sym可以得到第一行:MODULE Linux arm 7CCD14DA3C5CF634B4B59F034C2DFFB80 libcocos2dcpp.so

3、使用那一串字符串执行下面命令

mkdir -p ./symbols/libcocos2dcpp.so/7CCD14DA3C5CF634B4B59F034C2DFFB80

mv libcocos2dcpp.so.sym ./symbols/libcocos2dcpp.so/7CCD14DA3C5CF634B4B59F034C2DFFB80

  4、最后使用得到的dump文件

./minidump_stackwalk 4b09b77b-0b49-e55f-11afa2c2-3d4c4ead.dmp ./symbols > crashed.log

      5、可以看到错误在哪了如图(在HelloWorldScene.cpp的第539行的HelloWorld::menuCloseCallback(cocos2d::Ref*)方法)

          

好了,到此为此就完成了。(代码中好像自带了上传dump的功能,没有试过,成功后再来更新,另外dump文件的解析,如果全手动太麻烦了,可以做一个批处理命令来解析)

Using breakpad in cocos2d-x 3.2,dump信息收集的更多相关文章

  1. Qt 使用 Google Breakpad 捕获程序崩溃报告(dump文件) good

    http://blog.csdn.net/GoForwardToStep/article/details/56685810

  2. oracle dump数据库

    最近正在看老白的<DBA的思想天空>,了解数据块结构,想通过dump data block验证oracle对于行尾的NULL,是不占用存储空间的. 我们先来看一下怎样dump数据块: 1. ...

  3. Windows Phone App的dump文件实例分析-Stack Overflow

    前言 这篇文章我们一起来分析一个从Windows Phone Dev Center上下载下来的dump file.首先按照我上一篇的步骤设置好我们的Windbg,并按住Ctrl +D打开dumpfil ...

  4. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  5. 针对某个数据库error做systemstate dump

    如果想对某个具体error做systemstate dump收集,可以借助event来实现. 例如想在数据库遇到ora-00054时,收集数据systemstate dump信息: 开启: sqlpl ...

  6. jstack和线程dump分析

    转自:http://jameswxx.iteye.com/blog/1041173 一:jstack jstack命令的语法格式: jstack  <pid>.可以用jps查看java进程 ...

  7. thread dump

    最近在做性能测试,需要对线程堆栈进行分析,在网上收集了一些资料,学习完后,将相关知识整理在一起,输出文章如下. 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Du ...

  8. B*tree dump

    Oracle的索引是以平衡树的方式组织存储的:保存的是索引列的值,以及该行的rowid的一部分(文件号,块号,行号) 下面我们通过例子来了解一下: 1,create table test(id int ...

  9. [转]让程序在崩溃时体面的退出之SEH+Dump文件

    原文地址:http://blog.csdn.net/starlee/article/details/6649605 在我上篇文章<让程序在崩溃时体面的退出之SEH>中讲解了SEH中try/ ...

随机推荐

  1. java截取url中的值

    Map<String, Object> urlSplit(String data){ StringBuffer strbuf = new StringBuffer(); StringBuf ...

  2. poj3249

    显然是一道最短路径的题目,但是 1 ≤ n ≤ 100000, 0 ≤ m ≤ 1000000能轻松打爆dij+heap 怎么办? 挖掘题意,这是一个DAG图(有向无环图) 所以对于此类问题,我们有特 ...

  3. [2015编程之美] 第一场A

    #1156 : 彩色的树 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵n个节点的树,节点编号为1, 2, …, n.树中有n - 1条边,任意两个节点间恰好有一 ...

  4. [CF 471C] MUH and House of Cards

    C. MUH and House of Cards   Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elep ...

  5. I.MX6 Linux kernel LVDS backlight enable

    /*************************************************************************** * I.MX6 Linux kernel LV ...

  6. 【兼容】IE下PNG色差

    IE(包括IE7)中的PNG色差问题http://bbs.blueidea.com/thread-2910513-1-1.html修正IE对PNG颜色显示错误的问题http://www.lizhenw ...

  7. YQL

    YQL,(Yahoo! Query Language)是一种支持对互联网上的数据进行查询.过滤.连接.类似SQL语法的简单语言.用YQL官方的话:有了YQL,开发人员只需要使用一种 简单的查询语言即可 ...

  8. 【转】禁止seekbar的拖动事件

    原文网址:http://blog.csdn.net/ansionnal/article/details/8229801 当然是可以的! 其实是 onTouchEvent 事件时,不让他传递事件就行了! ...

  9. Android样式——Styles

    说明 样式(style)是属性的集合,用来指定View或者Window的外观和格式. 这些属性可以是height(高度).padding(内边距).font size(字体颜色)等. 样式定义在另一个 ...

  10. 常用ping服务列表

    以下是收集的ping服务器. ping是基于XML_RPC标准协议的更新通告服务,是用于blog在内容更新时通知博客搜索引擎及时进行抓取.更新的方式.博客搜索引擎在成功接受到ping以后,会立刻进行抓 ...