Using breakpad in cocos2d-x 3.2,dump資訊收集,breakpadcocos2d-x

來源:互聯網
上載者:User

Using breakpad in cocos2d-x 3.2,dump資訊收集,breakpadcocos2d-x

 

作者: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的路徑。

           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檔案的解析,如果全手動太麻煩了,可以做一個批處理命令來解析)

 




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.