`
aigo
  • 浏览: 2675961 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

Google Breakpad 完全解析

C++ 
阅读更多

原文:

http://bigasp.com/archives/450

http://bigasp.com/archives/458

 

Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,他支持Windows,Linux和Mac和Solaris。由于他本身跨平台,所以很大的减少我们在平台移植时的工作,毕竟崩溃转储,每个平台下都不同,使用起来很难统一,而Google breakpad就帮我们做到了这一点,不管是哪个平台下的崩溃,都能够进行统一的分析。现在很多工程都在使用他:最著名的几个如Chrome,Firefox,Picasa和Google Earth。另外他的License是BSD的,也就是说,我们即便是在商业软件中使用,也是合法的,哈哈,这么好的东西,我们能放过么?现在就让我们来看看这个神奇的软件吧。

原理简介

breakpad抓取dump的方式和一般我们抓取dump的方式不一样。在breakpad的wiki上有一幅图可以很好的概括他的原理。

 

breakpad把应用程序分成三个部分,代码,breakpad客户端和调试信息。

1. 在build system中,通过symbol dumper用平台相关的调试信息生成平台无关的symbol文件。这样做的好处很明显,一旦平台无关了,所有平台的崩溃就可以做统一的分析了。
2. breakpad采取进程外转储和分析崩溃的方式,他使用C/S结构,客户端用来捕获当前进程中发生的崩溃,并通知服务端崩溃发生。服务端用来响应客户端,抓取dump文件。这样做的目的是为了减少崩溃进程对dump的影响。
3. Dump生成后转发到崩溃分析器中,这个部分可以在本地也可以在服务器上,他对Dump文件进行解析,生成可读的堆栈信息。

这就是breakpad处理dump大概的流程。

对于原理的介绍google写的已经相当好了。更多的详细信息,可以直接移步到breakpad的wiki

安装和编译

breakpad的编译比较曲折,所以在此记录一下。

编译breakpad,请确认你的机器上装有以下的软件:
1. python 2.4.3
请不要使用python3,会报错。另外python2中推荐这个版本,使用新的版本在编译其他google的工程时有时会报错

2. Windows SDK 7
如果没有这个,编译会报错。另外这个是在线安装,时间很久,最好并行做其他的事情。

3. VS2005的补丁
KB918559
KB926601
KB935225
KB943969
KB947315

已经安装了以上软件的童鞋,就可以开始进行下面的工作鸟

1. 使用svn把代码checkout下来

1
2
# Non-members may check out a read-only working copy anonymously over HTTP.
svn checkout http://google-breakpad.googlecode.com/svn/trunk/ google-breakpad-read-only

2. 设置Windows SDK 7
装过其他版本Windows SDK的童鞋,记得一定要进行这一步,SDK的安装程序,并不会帮你设置VS。
运行开始菜单->程序->Microsoft Windows SDK v7.0->Visual Studio Registration->Windows SDK Configuration Tool,选择v7.0,点击Make Current。

3. 为python设置环境变量
由于breakpad使用python来生成Windows下的工程文件,所以需要将python所在目录,设置到环境变量PATH中去。

4. 生成Windows工程文件

1
2
3
4
cd "源码目录/src/tools/gyp"
 
# 注意,此处不能使用全路径,不然会出错
gyp.bat "../../client/windows/breakpad_client.gyp"

此时,在src/client/windows下就可以看到生成好的breakpad_client.sln了。运行吧!

5. Hello World!
编译build all,现在一般是不会报错了,如果报错,请检查是不是漏了什么步骤,特别是补丁。
编译完成之后,运行crash_generation_app吧,这是他的测试程序,dump的默认位置保存在C:Dumps下,请注意先建立好目录,不然会无法使用。
启动测试程序之后,此时还不能抓取dump,因为这个是breakpad中的服务器端,需要再启动一个测试程序,在第二个测试程序中,我们就可以试验Client菜单中的各种崩溃了。这些崩溃都会被抓住转存到C:Dumps目录下。

如何使用breakpad

在Windows下使用breakpad的方法很简单,只需要创建一个ExceptionHandler的类即可,大家可以在crash_generation_app这个工程中找到示例代码,也可以直接移步Wiki,上面说的也很详细。

1.进程内抓取Dump文件

进程内抓取Dump文件是最简单的breakpad的用法。使用方法很简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const std::wstring s_strCrashDir = L"c:\dumps";
 
bool
InitBreakpad()
{
    google_breakpad::ExceptionHandler *pCrashHandler =
        new google_breakpad::ExceptionHandler(s_strCrashDir,
            onExceptionFilter,
            onMinidumpDumped,
            NULL,
            google_breakpad::ExceptionHandler::HANDLER_ALL,
            MiniDumpNormal,
            NULL,
            NULL);
 
    if(pCrashHandler == NULL) {
        return false;
    }
 
    return true;
}

2.进程外抓取Dump文件

使用进程外抓取Dump时,需要指定服务端和客户端,在服务端中需要创建CrashGenerationServer的实例,而在客户端中则只需要创建ExceptionHandler即可。此外,如果服务端自己需要抓进程内的Dump,请将pipe的参数置为NULL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
const wchar_t s_pPipeName[] = L"\\.\pipe\breakpad\crash_handler_server";
const std::wstring s_strCrashDir = L"c:\dumps";
 
bool
InitBreakpad()
{
    google_breakpad::CrashGenerationServer *pCrashServer =
        new google_breakpad::CrashGenerationServer(s_pPipeName,
            NULL,
            onClientConnected,
            NULL,
            onClientDumpRequest,
            NULL,
            onClientExited,
            NULL,
            true,
            &s_strCrashDir);
 
    if(pCrashServer == NULL) {
        return false;
    }
 
    // 如果已经服务端已经启动了,此处启动会失败
    if(!pCrashServer->Start()) {
        delete pCrashServer;
        pCrashServer = NULL;
    }
 
    google_breakpad::ExceptionHandler *pCrashHandler =
        new google_breakpad::ExceptionHandler(s_strCrashDir,
            onExceptionFilter,
            onMinidumpDumped,
            NULL,
            google_breakpad::ExceptionHandler::HANDLER_ALL,
            MiniDumpNormal,
            (pCrashServer == NULL) ? s_pPipeName : NULL, // 如果是服务端,则直接使用进程内dump
            NULL);
 
    if(pCrashHandler == NULL) {
        return false;
    }
 
    return true;
}

使用breakpad的时候,有两个地方需要注意:
1. 记得把breakpad的solution下的几个工程,包含到你开发的工程中,或者直接包含他们的lib。
common:基础功能,包含一个对GUID的封装和http上传的类。
exception_handler:用来捕获崩溃的类。
crash_generation_server:breakpad的服务端,用来在产生崩溃时抓取dump。
crash_generation_client:breakpad的客户端,用来捕获当前进程的崩溃。

2. 在初始化breakpad之前,记得先创建好dump文件的目录,不然breakpad服务端将不能正常的写dump,这会导致breakpad客户端在崩溃时无限等待服务端dump写完的消息,最后失去响应。

分享到:
评论

相关推荐

    Google Breakpad的dump自动解析脚本

    使用Google Breakpad产生异常dump文件后通常需要敲一堆命令,然后产生你要找的堆栈信息,这里提供的脚本直接运行如下命令crash.sh ./luncher /tmp/d23f8d5e-5832-45ac-da9a718d-7d847b15.dmp ,即可自动产生/tmp/d23...

    google breakpad崩溃解析工具(已经编译过,可以直接使用)

    Google Breakpad是一款开源的崩溃转储分析工具,主要用于在应用程序崩溃时收集调试信息,并将其转换为可读格式,便于开发者定位问题。它被广泛应用于各种软件项目,包括Chrome浏览器和其他Google产品。本压缩包提供...

    Qt 使用GoogleBreakpad生成崩溃文件

    【Qt使用GoogleBreakpad生成崩溃文件】的知识点详解 在软件开发中,为了提供更好的用户体验和提高产品质量,开发者需要能够捕获并分析程序运行时的崩溃情况。GoogleBreakpad是一款强大的开源工具,它允许开发者在...

    GoogleBreakpad捕获崩溃文件需要的文件,包括lib库文件及头文件

    Google Breakpad是一个开源的工具集,专门设计用于帮助开发者捕获、转储和分析崩溃信息。本资源包含的压缩包提供了使用Google Breakpad进行崩溃文件捕获所需的lib库文件和头文件。 首先,我们来了解一下Google ...

    GoogleBreakpad.zip

    【GoogleBreakpad.zip】是一个包含Google Breakpad模块的压缩包,该模块主要用于应用程序崩溃时的错误报告和调试。Google Breakpad是由Google开发的一个开源工具,它可以帮助开发者收集、符号化和上传应用程序崩溃时...

    google breakPad

    分析工具(如Google's `minidump_stackwalk`)可以解析Minidump并生成详细的崩溃报告,包括调用堆栈和可能的错误原因。 在2018年10月31日,BreakPad仍然是最新的技术,用于Android异常捕获。集成BreakPad到Android...

    google_breakpad工具.zip

    这个压缩包文件“google_breakpad工具.zip”包含了适用于不同操作系统平台的Breakpad解析工具,包括Windows、Ubuntu和CentOS。 在Windows平台上,Breakpad提供的两个主要工具是`dump_syms.exe`和`minidump_...

    google-breakpad(刚git下来的,热乎的)

    **Google Breakpad 知识详解** Google Breakpad是一款开源的崩溃转储分析工具,由Google开发,主要用于在软件出现未捕获异常或崩溃时收集调试信息。它可以在各种操作系统上运行,包括Windows、Linux和macOS,为...

    google_breakpad实例

    Google Breakpad是一款开源的崩溃转储工具,常用于在应用程序崩溃时收集调试信息,以便后续分析和解决问题。这个实例提供了一个使用Breakpad的基础教程,特别适合初学者了解和实践Breakpad的功能。 首先,我们要...

    Google Breakpad的使用

    - **处理转储文件**:在服务器端,需要解析和分析接收到的.dmp文件,这可能需要使用Breakpad的服务器工具集。 4. **调试与分析** - 使用Breakpad提供的工具(如`minidump_stackwalk`)对.dmp文件进行符号化,找出...

    Google Breakpad使用方法

    **Google Breakpad 使用指南** Google Breakpad 是一个开源的崩溃转储和分析工具,主要用于Windows、Linux和macOS等操作系统。它为应用程序提供了一个强大的崩溃报告机制,可以在程序崩溃时捕获堆栈跟踪和其他关键...

    google-breakpad

    《谷歌Breakpad:高效能的崩溃报告工具》 在IT领域,尤其是在软件开发过程中,确保程序的稳定性和可靠性是至关重要的。然而,由于各种原因,软件可能会遇到未预期的错误,导致程序崩溃。这时,"崩溃报告"就成为了...

    linux google breakpad

    Linux下的Google Breakpad是一款强大的崩溃转储和故障分析工具,尤其在C++程序中广泛使用。它能够在程序异常崩溃时捕获内存状态,并将其转换为崩溃快照,以便于后期分析错误原因。以下是对Google Breakpad及其在...

    Google Breakpad构建编译使用完整包

    **Google Breakpad** 是一个开源的崩溃转储库,它被设计用于跨平台的应用程序,尤其是在发生未捕获异常或致命错误时,帮助开发者收集、分析和处理崩溃信息。Breakpad支持包括Windows、Linux、macOS在内的多个操作...

    breakpad-20200714.zip

    这个压缩包 "breakpad-20200714.zip" 包含了 Breakpad 在 Windows 平台上的编译版本,是 2020 年 07 月 14 日从 Google 官方获取的最新源码编译而成的静态库。 **核心功能** 1. **崩溃捕获**:Breakpad 可以在应用...

    2018年10月12日最新的google breakpad源码,包含linux_syscall_support.h

    Google Breakpad是一款开源的崩溃转储和分析工具,主要用于帮助开发者收集、管理和解析应用程序崩溃时的信息。这个压缩包包含了2018年10月12日更新的Breakpad源码,以及`linux_syscall_support.h`这个关键的头文件。...

    Arm breakpad

    `Arm breakpad`是一个专为Linux ARM架构设计的崩溃报告系统,它源自Google的开源项目,用于在应用程序崩溃时收集调试信息,帮助开发者诊断和修复问题。在Android设备和其他基于ARM处理器的Linux系统上,Breakpad能够...

    Breakpad

    它由Google开发并维护,旨在帮助开发者捕获、记录和报告应用程序的崩溃信息,以便于调试和修复错误。 Breakpad的工作流程主要包括三个主要阶段:崩溃时的处理、崩溃信息的序列化和崩溃信息的上传与分析。 1. **...

    goole-breakpad-source

    3. **转储分析(Dump Analysis)**:Breakpad提供了分析工具,可以解析minidump文件并生成详细的崩溃报告。报告通常包含崩溃时的调用堆栈、涉及的模块和变量值等信息。 4. **服务器集成(Server Integration)**:...

    breakpad vs可以直接编译的源码

    Breakpad是Google开发的一个开源库,专门用于处理应用程序崩溃时的错误报告,它提供了一种在各种操作系统上捕获、符号化和传输崩溃堆栈跟踪的方法。这个项目对于开发者来说非常有用,因为它可以帮助他们追踪和调试...

Global site tag (gtag.js) - Google Analytics