zoukankan      html  css  js  c++  java
  • Using breakpad in cocos2d-x 3.2,dump信息收集

     

    作者: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文件的解析,如果全手动太麻烦了,可以做一个批处理命令来解析)

     

  • 相关阅读:
    数据库优化
    List,map,Set区别
    ID选择器
    最简单的添加删除行操作
    JQ2
    最简单的JQ实现
    20180416
    一行细分的HTML写法
    out参数的使用
    结构的使用
  • 原文地址:https://www.cnblogs.com/xioapingguo/p/4037268.html
Copyright © 2011-2022 走看看