作者: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,-1);return JNI_VERSION_1_4;
}

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

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

void HelloWorld::menuCloseCallback(Ref* pSender)
{int *i = NULL;*i = 1;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文件的解析,如果全手动太麻烦了,可以做一个批处理命令来解析)

转载于:https://www.cnblogs.com/xioapingguo/p/4037268.html

Using breakpad in cocos2d-x 3.2,dump信息收集相关推荐

  1. android R版本常见dump信息分析

    adb shell dumpsys activity activities Display #:屏幕的displayId,默认主屏是0,堆栈在display上自上而下输出,越往上越在栈顶图层越在上 R ...

  2. windows环境C++抓取dump信息

    Minidump文件生成 1.Minidump概念 minidump(小存储器转储)可以理解为一个dump文件,里面记录了能够帮助调试crash的最小有用信息.实际上,如果你在系统属性 -> 高 ...

  3. SurfaceFlinger的dump信息详解

    SurfaceFlinger的dump信息详解 1. 特殊宏的打开 2. Sync机制 3. DispSync参数 4. layer的dump 4.1 区域信息 4.2 基本信息 4.3 buffer ...

  4. Java命令:jstack — 获取线程dump信息

    目录 一.命令介绍 二.使用实例 实例一:jstack查看输出 实例二:jstack统计线程数 实例三:jstack检测死锁 实例四:jstack检测CPU高 一.命令介绍 Usage:jstack ...

  5. oracle数据块dump信息,从数据块的dump信息能看出什么

    本帖最后由 zcs0237 于 2013-6-13 16:57 编辑 a.本文搜集大量网友文章编写而成 b.为节省篇幅,部分输出结果做了精简 c.感谢对本帖补充.建议.错误更正 d.推荐网站: === ...

  6. JVM调优:heap dump信息分析

  7. arm linux 内核崩溃,用sysrq-trigger实现ARM Linux一键内核崩溃、一键关机、一键dump信息等...

    原创 宋宝华 Linux阅码场 2018-01-12 sysrq有多种功能,对于ARM Linux这种嵌入式没键盘的系统来说,也可以通过/proc/sysrq-trigger来进行操作. 实验平台:Q ...

  8. arm linux死机不是崩溃,用sysrq-trigger实现ARM Linux一键内核崩溃、一键关机、一键dump信息等...

    sysrq有多种功能,对于ARM Linux这种嵌入式没键盘的系统来说,也可以通过/proc/sysrq-trigger来进行操作. 实验平台:QEMU模拟的ARM Linux 内核版本: # una ...

  9. core dump 分析

    环境变量设置 可以通过 /etc/security/limits 文件对各用户的基本配置参数包括 core 大小进行限制.或者通过 ulimit 更改当前环境下的 core 大小限制. 默认情况下,应 ...

最新文章

  1. [vb+mo] visual baisc 6.0 基于mapobjects 2.4 开发的数字化校园电子地图
  2. java服务端监听_Java客户端正在监听WebSphere MQ服务器?
  3. 含有PCA动画演示的帖子,需要多读几遍的经典
  4. 缓存机制 java_缓存机制:java中缓存的原理
  5. 什么样的知识,值得我们终生学习
  6. css tab 后竖线_H5网页布局+css代码美化,零基础参考
  7. vue-cli目录结构介绍
  8. 中国计算机学会暂停与IEEE合作;百度接连五位高管离职;所有版本 Docker 被爆严重漏洞!| 极客头条...
  9. 大数据分析必不可少之数据仓库
  10. Mock.java - 二次封装(基于属性结构类型生成测试数据)
  11. ifix与mysql_基于ODBC技术实现iFix组态软件与关系数据库通讯接口
  12. CSA云安全指南V4.0 D9 D10
  13. linux软连接与环境变量
  14. TOGAF架构愿景阶段经常用到的3种经典分析模型
  15. 怎么让Html的高度自适应屏幕高度
  16. 基于jsp+mysql+ssm酒店管理系统-计算机毕业设计
  17. (文末福利)如果代码莫名其妙跑起来了,就不要去动它了……吗?
  18. C++学习——基于binance的AS做市模型
  19. python读matlab.fig_python可视化:matplotlib学习笔记
  20. window 卸载串口cp210x驱动并安装

热门文章

  1. 进军“手机照相馆”:京东要和3C厂商干什么?
  2. SQL2008-分页显示3种方法
  3. Redis+keepalived 主从搭建
  4. 互联网协议 — DNS 缓存机制
  5. 微服务架构 — 微服务框架
  6. 架构师之路 — API 经济 — Web、HTTP Server、API Service、Application
  7. 互联网协议 — 数据路由技术
  8. 程序编译生成的Hex、Bin、axf和elf格式
  9. 220V电容启动交流电机
  10. 树上边分治-求任意两点路径的总和