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。此时再进行第二步即可顺利安装)
- 服务器端的python需要用到MySQLdb模块,配置方法如下: