breakpad的簡單介紹
Breakpad是一套庫和工具,允許你去發布沒有編譯器調試信息的應用程序,並且該程序能夠將crashs記錄到輕巧的minidump文件中,發送回你的服務器,根據minidump文件產生c/c++堆棧跟蹤。另外,當有明確的需求Breakpad也可以寫minidump即使沒有crash。Breakpad現在已經被應用在Google Chrome, Firefox, Google Picasa, Camino, Google Earth以及其他的一些項目中。 簡單的示意圖如下:

如圖所示,

Breakpad主要有3個主要組成:
- Client:這是一個庫你必須包含進你的應用。它可以捕獲當前的線程狀態和當前已經加載的可執行共享庫的ID寫入mindump文件。你可以配置client去寫minidump當crash發生的時候,或者當有明確的請求的時候(沒有crash)。
- symbol dumper:這個程序可以讀取你的編譯器產生的調試信息並且聲稱symbol file,詳見這里。
- processor:這個程序可以讀取minidump文件,據此找到適合這個可執行完文件和共享庫的symbol文件,從而聲稱人可讀的c/c++退棧跟蹤信息
breakpad在linux環境下的簡單部署應用
1. 開發系統環境:CentOS5.5
2. 前期需安裝軟件:
- svn,g++,vim(不一定),都可通過終端的apt-get install 命令安裝。
- 安裝vim時,出現 “無法獲得鎖 /var/lib/dpkg/lock - open(11:資源暫時不可用)”的問題,解決方法:直接終端輸入命令“sudo kill PID”(PID是占用的進程號)。
3. 獲取google-brekapad代碼
- 直接通過svn checkout獲取(svn checkout http://google-breakpad.googlecode.com/svn/trunk/)。
- 建立Breakpad的庫:進入代碼目錄,終端輸入命令 ./configure 和 make。在 src/client/linux/ 下產生一個靜態庫 libbreakpad_client.a,它包含了產生minidump文件的所有代碼。
4. 一個產生minidump文件的簡單例子(詳見
LinuxStarterGuide):
- 首先需要將 libbreakpad_client.a包含進你的二進制文件,並且將google-breakpad的src文件目錄包含到linux的paths。具體做法如下:
- C_INCLUDE_PATH
- 另,《linux gcc編譯時頭文件和庫文件的搜索路徑以及設置方法》
- 實例化ExceptionHandler類
- 因為將存在於整個程序生命周期,應極盡簡單。
- 具體實例化參數說明,見exception_handler.h
- 注意:應盡量少地對回調函數進行操作,因為你的應用處在不安全的狀態,有可能在分配內存或是從公共庫調用函數時不安全。最安全的做法是去fork以及exec一個新的進程去做你想做的工作。如果真的必須在回調函數中工作,可參看這里1以及這里2
- 代碼如下:
-
#include"client/linux/handler/exception_handler.h" staticbool dumpCallback(constchar* dump_path, constchar* minidump_id, void* context, bool succeeded) { printf("Dump path: %s/%s.dmp\n", dump_path, minidump_id); return succeeded; } void crash() { volatileint* a =(int*)(NULL); *a =1; } int main(int argc,char* argv[]) { google_breakpad::ExceptionHandler eh("/tmp", NULL, dumpCallback, NULL,true); crash(); return0; }
- 編譯主要用了公司自制的mk軟件(基於GCC編譯器,類似makefile),debug版本下會生成帶有調試信息的可執行文件
- 之后在程序崩潰后就會自動生成以guid命名的minidump文件
5. 生成symbol文件
- symbole文件主要用來分析生成有用的堆棧信息,具體說明見這里。
- 前提條件:
- 程序的二進制文件需要帶有調試信息(編譯時-g,由於是用了mk,這一步可忽略)
- Breakpad目錄下已生成 dump_syms工具
- 終端命令:$ google-breakpad/src/tools/linux/dump_syms/dump_syms./test>test.sym生成test.sym的symbol文件
6. 發送minidump文件和symbole文件
- breakpad提供了minidump文件和symbol文件的上傳模塊,a minidump upload tool。
- sender模塊采用libcurl,利用HTTPUpload類中的靜態方法,采用HTTP(S) POST模式將崩潰文件遞交到服務器。
- (KClient.py)[使用breakpad自帶的上傳工具,失敗,原因未知!故寫了一個python的,成功!]
7. 服務器接收端
- KServer.py:接收symbol文件和minidump文件,並且存到相應目錄
- KStoreSymbolFile.py:將symbol文件存到相應目錄,方便minidump_stackwalk工具分析
- KInvokeMinidumpStackwalk.py: 調用 minidump_stackwalk工具對minidump文件進行分析,生成一個文本結果
- KInsertToDatabase.py:對文本結果進行分析,並且插入到mySQL數據庫
- PS:
- 服務器端的python需要用到MySQLdb模塊,配置方法如下:
- 安裝:yum install mysql-devel,easy_install MySQL-python
- 幫助:help ('MySQLdb') help ('MySQLdb.cursors')
- 導入:import MySQLdb
- 連接:conn = MySQLdb.Connection('host', 'user', 'password', 'dbname')
- 獲取數據庫指針(該模塊底層其實是調用C API的,需要先得到當前指向數據庫的指針):cur = conn.cursor()
- 一個比較完整的例子:相見這里
- python的setuptools的安裝方法
- wget -q http://peak.telecommunity.com/dist/ez_setup.py
- python ez_setup.py (這一步必然失敗,是為了第三步取得url准備的.)
- wget http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c8-py2.4.egg (注意:第三步的url是根據第二步得到的url。此時再進行第二步即可順利安裝)