作者: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. SharePoint2013切换帐户登录菜单

    SharePoint2013帐户姓名显示的地方没有切换帐户的菜单,这个功能对于终端用户是可有可无的,但对于sharepoint管理员或sharepoint开发人员来讲,却是一个很重要的菜单,由于经常要 ...

  2. C++类的复制构造函数和赋值运算符

    前言: C++面向对象的编程过程中,凡是在类中运用到动态内存分配的时候总是会写一个显示的复制构造函数和赋值重载运算符,本文将结合C++ Primer Plus一书的内容分析下原因: 一.在C++编程中 ...

  3. hdu 1412 (STL list)

    简单例题 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1412 list 相关博客:http://www.cnblogs.com/fangyukuan/a ...

  4. C#中的预处理器指令

    C#中有许多名为“预处理器指令”的命令.这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面. 例如,使用预处理器指令可以禁止编译器编译代码的某一部分.如果计划发布两个版本的代码,即基 ...

  5. vfp 操作excel

    VFP全面控制EXCEL 收藏 VFP和Excel都可以用来进行处理数据库表格,如果巧妙地将二者的优点结合起来,将会大大方便我们的工作.比如我们可以利用VFP进行处理数据,而利用Excel的预览打印功 ...

  6. UVa 221 (STL 离散化) Urban Elevations

    题意: 作图为n个建筑物的俯视图,右图为从南向北看的正视图,按从左往右的顺序输出可见建筑物的标号. 分析: 题中已经说了,要么x相同,要么x相差足够大,不会出现精度问题. 给这n个建筑物从左往右排序, ...

  7. 以CTE表达式实现MSSQL的字符串分割函数

    ALTER     FUNCTION [dbo].[Split] (@sep varchar(2), @s varchar(512))RETURNS tableASRETURN (    WITH P ...

  8. 【转】Android底层库和程序

    原文网址:http://blog.csdn.net/louiswangbing/article/details/6616202 Android底层库和程序 1.     本地实现的基本结构 Andro ...

  9. error LNK2001: 无法解析的外部符号 _IID_IDirectDraw7

    工程使用了DirectDraw,编译出错 error LNK2001: 无法解析的外部符号 _IID_IDirectDraw7 解决办法是吧dxguid.lib添加到工程中,把lib所在目录添加到工程 ...

  10. c#: 解析json, 转成xml, 简单方便

    没看到.net framework中有这样的功能, 懒得到处找了, 索性花点时间自己写一个 /* * Created by SharpDevelop. * Date: 2013/6/24 * User ...