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这个命令是这样的吗?我这里生成不了啊。

<think>我们将在C++项目中使用Google Breakpad来捕获和处理崩溃报告。Breakpad是一个跨平台的崩溃报告系统,它可以在程序崩溃时生成minidump文件,然后我们可以使用这些文件来分析和定位问题。 步骤: 1. 下载Breakpad源代码并编译。 2. 将Breakpad集成到C++项目中。 3. 初始化异常处理程序。 4. 测试崩溃捕获。 注意:由于Breakpad是跨平台的,这里我们将以Windows平台为例进行说明,但也会简要提及Linux和Mac。 ### 1. 下载Breakpad源代码并编译 首先,我们需要获取Breakpad的源代码。Breakpad是Chromium项目的一部分,源代码可以在 https://chromium.googlesource.com/breakpad/breakpad 获取。 #### 在Windows上编译: - 使用Visual Studio进行编译。 - 需要先安装depot_tools(用于获取Breakpad的依赖)。 - 然后使用GYP生成VS解决方案,再使用VS编译。 具体步骤: 1. 安装depot_tools(将其添加到PATH环境变量)。 2. 打开命令提示符,执行: ``` mkdir breakpad cd breakpad gclient fetch breakpad cd src ``` 3. 使用GYP生成解决方案: ``` python tools\gyp\gyp.bat --no-circular-check client\windows\breakpad_client.gyp ``` 这会生成`client\windows\breakpad_client.sln`。 4. 用Visual Studio打开该解决方案并编译。 编译后,我们主要需要以下文件: - `client\windows\Release\lib\common.lib` 和 `client\windows\Release\lib\exception_handler.lib` - 头文件:`src/client/windows/crash_generation/crash_generation_client.h`, `src/client/windows/handler/exception_handler.h` 等。 #### 在Linux上编译: 使用autotools: ``` ./configure make make install ``` #### 在Mac上编译: 使用Xcode项目文件(在mac目录下)进行编译。 ### 2. 集成Breakpad到C++项目 将Breakpad的头文件和编译好的库文件添加到项目中。 在Visual Studio中: - 添加头文件路径(包含`src`目录)。 - 链接`common.lib`和`exception_handler.lib`。 ### 3. 初始化异常处理程序 在应用程序启动时,初始化Breakpad的异常处理器。以下是一个简单的示例代码: ```cpp #include "client/windows/handler/exception_handler.h" namespace { // 回调函数,当崩溃发生时会调用这个函数 bool MinidumpCallback(const wchar_t* dump_path, const wchar_t* id, void* context, EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion, bool succeeded) { if (succeeded) { printf("Minidump created at %ws\\%ws.dmp\n", dump_path, id); } else { printf("Failed to create minidump\n"); } return succeeded; } } // namespace int main() { // 设置dump文件的存储路径 std::wstring dump_path = L".\\dumps\\"; // 创建异常处理器 google_breakpad::ExceptionHandler eh( dump_path, /* 存储dump的路径 */ nullptr, /* 过滤回调,可以设置过滤条件,这里为nullptr */ MinidumpCallback, /* 回调函数 */ nullptr, /* 回调上下文 */ google_breakpad::ExceptionHandler::HANDLER_ALL // 捕获所有异常 ); // 下面是一个故意制造崩溃的代码,用于测试 int* ptr = nullptr; *ptr = 1; // 这将导致访问违规,触发崩溃 return 0; } ``` ### 4. 测试 运行程序,它应该崩溃并在`./dumps`目录下生成一个minidump文件(扩展名为.dmp)。然后我们可以使用`dump_syms`和`minidump_stackwalk`(Breakpad提供的工具)来分析dump文件。 ### 注意事项: - 在发布版本中,应该将异常处理器的初始化放在尽可能早的位置,以确保在程序启动后发生的任何崩溃都能被捕获。 - 在Linux和Mac上,初始化方式类似,但头文件和类名可能略有不同。例如,在Linux上,头文件路径是`client/linux/handler/exception_handler.h`,类名是`google_breakpad::ExceptionHandler`。 ### 相关工具: - `dump_syms`:用于从二进制文件(可执行文件或动态库)中提取符号信息。 - `minidump_stackwalk`:使用符号信息将minidump文件转换为可读的堆栈跟踪。 ### 符号生成和堆栈跟踪: 1. 使用`dump_syms`生成符号文件(.sym): ``` dump_syms myapp.exe > myapp.sym ``` 2. 将符号文件放在特定的目录结构中(如`symbols/myapp.pdb/<ident>/myapp.sym`),其中`<ident>`是dump_syms输出文件第一行中的标识符。 3. 使用`minidump_stackwalk`分析minidump文件: ``` minidump_stackwalk minidump.dmp symbols > stacktrace.txt ``` 这样,我们就能够通过生成的stacktrace.txt来定位崩溃的位置。 ### 跨平台注意事项: - 在Linux上,需要链接`breakpad_client`库。 - 在Mac上,需要链接`Breakpad.framework`。 ### 完整示例(Windows): 以下是一个完整的Windows控制台程序示例,集成了Breakpad: ```cpp #include <iostream> #include <string> #include "client/windows/handler/exception_handler.h" namespace { bool DumpCallback(const wchar_t* dump_path, const wchar_t* id, void* context, EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion, bool succeeded) { if (succeeded) { std::wcout << L"Minidump created at: " << dump_path << L"\\" << id << L".dmp" << std::endl; } else { std::cerr << "Failed to create minidump" << std::endl; } return succeeded; } } // namespace int main() { // 设置dump文件保存路径(当前目录下的dumps文件夹) std::wstring dump_path = L".\\dumps"; // 创建异常处理器 google_breakpad::ExceptionHandler eh( dump_path, nullptr, DumpCallback, nullptr, google_breakpad::ExceptionHandler::HANDLER_ALL ); // 制造崩溃(解引用空指针) volatile int* a = nullptr; *a = 1; return 0; } ``` ### 编译和运行: 1. 确保项目链接了Breakpad的库(common.lib和exception_handler.lib)。 2. 运行程序,会在dumps文件夹下生成一个minidump文件。 ### 相关问题: §§相关问题§§: 1. 如何在Linux系统中集成Breakpad? 2. 如何从minidump文件中获取堆栈跟踪信息? 3. Breakpad在捕获崩溃时如何避免自身崩溃? 4. 如何处理多线程环境下的崩溃捕获?</think>### 在C++项目中集成Google Breakpad Google Breakpad是一个跨平台的崩溃报告系统,用于捕获应用程序崩溃时的minidump文件。以下是完整集成步骤: #### 1. 下载和编译Breakpad **Windows示例(使用Visual Studio):** ```bash # 获取源码 git clone https://chromium.googlesource.com/breakpad/breakpad cd breakpad # 生成VS解决方案(需安装Pythonpython src\tools\gyp\gyp.bat --no-circular-check src\client\windows\breakpad_client.gyp # 用VS2019编译 msbuild src\client\windows\breakpad_client.sln /p:Configuration=Release ``` #### 2. 项目集成代码 ```cpp #include "client/windows/handler/exception_handler.h" namespace { // 崩溃回调函数 bool DumpCallback(const wchar_t* dump_path, const wchar_t* minidump_id, void* context, EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion, bool succeeded) { printf("Crash dump saved to: %ws\\%ws.dmp\n", dump_path, minidump_id); return succeeded; } } // namespace int main() { // 初始化异常处理器 google_breakpad::ExceptionHandler eh( L".\\crashes\\", // 崩溃文件存储目录 nullptr, // 过滤器回调 DumpCallback, // 崩溃回调 nullptr, // 回调上下文 google_breakpad::ExceptionHandler::HANDLER_ALL // 捕获所有异常类型 ); // 测试崩溃(解引用空指针) volatile int* ptr = nullptr; *ptr = 42; return 0; } ``` #### 3. 编译选项(VS2019示例) - 包含目录:`breakpad\src` - 库目录:`breakpad\src\client\windows\Release\lib` - 链接库:`exception_handler.lib common.lib` #### 4. 符号文件生成(调试用) ```bash # 从exe生成符号 dump_syms.exe MyApp.exe > MyApp.sym # 创建符号目录结构 mkdir -p symbols/MyApp.pdb/ABCDEF123456 mv MyApp.sym symbols/MyApp.pdb/ABCDEF123456 ``` #### 5. 分析minidump文件 ```bash minidump_stackwalk.exe crashes\abc123.dmp symbols > crash_report.txt ``` --- ### 关键机制解释 1. **异常捕获原理**: - Windows:通过`SetUnhandledExceptionFilter`注册顶层异常处理器 - Linux:使用`sigaction`注册信号处理器(SIGSEGV等) - 捕获异常后冻结线程上下文,生成minidump 2. **minidump内容**: - 崩溃线程的寄存器状态 - 所有线程的调用栈 - 加载的模块列表 - 关键内存区域 3. **崩溃安全设计**: - 使用独立进程处理dump写入(crash_generation_server) - 避免在崩溃上下文中进行复杂操作 - 使用预分配内存避免堆分配 --- ### 常见问题解决方案 1. **dump文件不生成**: - 检查目录写入权限 - 确认未注册其他异常处理器 - 在`DumpCallback`设置断点调试 2. **跨平台差异处理**: ```cpp // Linux/Mac初始化示例 #include "client/linux/handler/exception_handler.h" void InitBreakpad() { google_breakpad::MinidumpDescriptor descriptor("/tmp/crashes"); new google_breakpad::ExceptionHandler(descriptor, nullptr, DumpCallback, nullptr, true, -1); } ``` 3. **优化dump文件大小**: ```cpp ExceptionHandler eh( dump_path, nullptr, DumpCallback, nullptr, true, // 启用压缩 ExceptionHandler::MINIDUMP_NORMAL // 基础信息模式 ); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值