Breakpad在linux下的簡單部署和應用


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。具體做法如下:
  • 實例化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。此時再進行第二步即可順利安裝)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM