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