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

     

  • 相关阅读:
    免费的视频、音频转文本
    Errors are values
    Codebase Refactoring (with help from Go)
    Golang中的坑二
    Cleaner, more elegant, and wrong(msdn blog)
    Cleaner, more elegant, and wrong(翻译)
    Cleaner, more elegant, and harder to recognize(翻译)
    vue控制父子组件渲染顺序
    computed 和 watch 组合使用,监听数据全局数据状态
    webstorm破解方法
  • 原文地址:https://www.cnblogs.com/xioapingguo/p/4037268.html
Copyright © 2011-2022 走看看