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。此时再进行第二步即可顺利安装)
posted @ 2012-07-21 15:32  nepaul  阅读(5504)  评论(0编辑  收藏  举报