breakpad安装

breakpad安装

971人阅读 评论(4) 收藏 举报


最近在开发过程中使用到breakpad库,现将使用过程记录下来。

 

breakpad编译及安装
首先从http://code.google.com/p/google-breakpad/ 拿到breakpad代码。

a.windows下的安装
1.windows下的安装需要python 和gyp 生成sln,vcproj工程文件,所以先安装python,然后从http://gyp.googlecode.com/svn/trunk/拿到gyp工程代码。
2.在gyp的根目录下运行python gyp --no-circular-check  yourpath/breakpad/src/client/windows/breakpad_client.gyp, 记住要加上--no-circular-check,并且使用相对路径。命令成功执行后会在 yourpath/breakpad/src/client/windows/ 目录下生成sln文件。
3.用vs打开sln工程文件,直接编译生成就可以了。注意sln默认使用/MT(静态连接c运行时库),一般情况下需要改为/MD(动态连接c运行时库)。
4.测试目录下的文件编译时会出现连接问题,将common.lib加入到连接选项就可以了。
5.编译自己的工程文件时需要连接到的库为common.lib,exception_handler.lib,crash_generation_server.lib。

b.linux下的安装
INSTALL文档里说明用`./configure; make; make install'可以编译安装,但我本地的机器上死活不能得到正确的Makefile文件。
故改为用src/client/linux下的Makefile也可以正确编译。编译后生成libbreakpad.a的静态库。

breakpad在linux下生成的文件是dmp格式,而gdb使用的是core文件格式,在src/tools/linux/md2core下可以编译minidump-2-core.cc生成一个dmp转core的小工具。
编译minidump-2-core.cc时发现缺少minidump_format_linux.h文件,minidump_format_linux.h文件的内容如下:
#ifndef CLIENT_LINUX_MINIDUMP_FORMAT_LINUX_H_
#define CLIENT_LINUX_MINIDUMP_FORMAT_LINUX_H_

// These are additional minidump stream values which are specific to the linux
// breakpad implementation.
enum {
  MD_LINUX_CPU_INFO              = 0x47670003,    /* /proc/cpuinfo    */
  MD_LINUX_PROC_STATUS           = 0x47670004,    /* /proc/$x/status  */
  MD_LINUX_LSB_RELEASE           = 0x47670005,    /* /etc/lsb-release */
  MD_LINUX_CMD_LINE              = 0x47670006,    /* /proc/$x/cmdline */
  MD_LINUX_ENVIRON               = 0x47670007,    /* /proc/$x/environ */
  MD_LINUX_AUXV                  = 0x47670008,    /* /proc/$x/auxv    */
};

#endif  // CLIENT_LINUX_MINIDUMP_FORMAT_LINUX_H_
将这个文件放在src/common/linux/目录下,就可以顺利生成了。


以下是测试文件:
#include <cstdio>  
#include "handler/exception_handler.h"  
 
namespace {  
#ifdef WIN32
     static bool callback(const char *dump_path,
                                   const char *id,
                                   void *context,
                                   bool succeeded)
 {
 if (succeeded) {  
                printf("dump guid is %s/n", id);  
            } else {  
                printf("dump failed/n");  
            }  
            fflush(stdout);  
 
            return succeeded;  
 }
#else
static bool callback(const wchar_t *dump_path, const wchar_t *id,  
        void *context, EXCEPTION_POINTERS *exinfo,  
        MDRawAssertionInfo *assertion,  
        bool succeeded) {  
            if (succeeded) {  
                printf("dump guid is %ws/n", id);  
            } else {  
                printf("dump failed/n");  
            }  
            fflush(stdout);  
 
            return succeeded;  
    }  
 #endif
    static void CrashFunction() {  
        int *i = reinterpret_cast<int*>(0x45);  
        *i = 5;  // crash!  
    }  
 
}  // namespace  
 
int main(int argc, char **argv) {  
    google_breakpad::ExceptionHandler eh(  
        ".", NULL, callback, NULL,  
        true); 
try{  
    CrashFunction();  
}
catch(...)
{
printf("catch crash/n");  
}
 printf("did not crash?/n");  
    return 0;  

windows下的连接common.lib,exception_handler.lib,crash_generation_server.lib库,linux下连接libbreakpad.a库。
运行就可产生一个dmp文件了。

查看评论
4楼 Flaght 2011-03-14 10:53发表 [回复]

其实在linux 不是编译不过去,而是不能从windows上SVN获取的代码再拿到linux编译,文件系统不一样的。我在linux上获取以后,一切都是正常的!
3楼 wff161611 2010-08-06 22:52发表 [回复]

十分感谢 在windows下生成工程成功
breakpad的目录为I:/breakpad
gyp的目录为I:/gyp
命令为
python gyp --no-circular-check ../breakpad/src/client/windows/breakpad_client.gyp
成功
2楼 xtwgigu 2010-07-28 17:31发表 [回复]

python.exe gyp --no-circular-check E:/googlebreakpadsrc/client/windows/breakpad_client.gyp 这是完整的命令
1楼 xtwgigu 2010-07-28 17:30发表 [回复]

您好 python gyp --no-circular-check yourpath/breakpad/src/client/windows/breakpad_client.gyp这个命令是这样的吗?我这里生成不了啊。

你可能感兴趣的:(linux,exception,python,callback,makefile,generation)