您的位置:首页 > 编程语言 > Go语言

Google Breakpad 完全解析(二) —— Windows前台实现篇

2015-04-18 16:36 609 查看

TableofcontentsforGoogleBreakpad完全解析

GoogleBreakpad完全解析(一)——Windows入门篇
GoogleBreakpad完全解析(二)——Windows前台实现篇

原创文章,转载请标明出处:SoulApogee(http://bigasp.com),谢谢。

好,看完了如何使用breakpad,我们现在看看breakpad在Windows下到底是如何实现的呢?


代码结构

在我们来看breakpad是如何实现其强大的功能之前,我们先来看一下他的代码结构吧。

Googlebreakpad的源代码都在src的目录下,他分为如下几个文件夹:

client:这下面包含了前台应用程序中捕捉dump的部分代码,里面按照平台分成各个子文件夹

common:前台后台都会用到的部分基础代码,字符串转换,内存读写,md5神马的

google_breakpad:breakpad中公共的头文件

processor:用于在后台处理崩溃的核心代码

testing:测试工程

third_party:第三方库

tools:一些小工具,用于处理dump文件和符号表

我们先来看Windows下前台实现的部分,也就是client文件夹下的代码。


breakpad的崩溃捕获机制

在Windows下捕获崩溃,大家很容易会想到那个捕获结构化异常的Api:SetUnhandledExceptionFilter。

breakpad中也使用了这个Api来实现的崩溃捕获,另外,breakpad还捕获了另外两种C++运行库提供的崩溃,一种是使用_set_purecall_handler捕获纯虚函数调用产生的崩溃,还有一种是使用_set_invalid_parameter_handler捕获错误的参数调用产生的崩溃。

?
2
4
6
8
10
(handler_types&HANDLER_EXCEPTION)


#if_MSC_VER>=1400//MSVC2005/8
(handler_types&HANDLER_INVALID_PARAMETER)


[code](handler_types&HANDLER_PURECALL)

1

explicit
const

1
3
5
7
9
11
13
15
17
19
21
23
const
:checkpoint_file_(checkpoint_file),

[code]last_sent_date_(-1),
[code]FILE[code]if
"r"
ReadCheckpoint(fd);

(fd);


ReportResultCrashReportSender::SendCrashReport(
[code]wstring&url,
map<wstring,wstring>¶meters,

wstring&dump_file_name,wstring*report_code){

today=GetCurrentDate();

(today==last_sent_date_&&

reports_sent_>=max_reports_per_day_){

[code]RESULT_THROTTLED;

<codeplain"="">}


调整每日上传崩溃的最大数量的函数是set_max_reports_per_day。

需要注意的是:在上传dump文件的时候,crash_report_sender并不会对dump文件进行分析,而是直接上传整个dump文件,如果你需要上传的dump文件非常大的话,可以考虑把崩溃分析处理的逻辑放入前台,通过去重或者直接上传分析结果,减少上传的文件大小。


breakpad存在的问题


进程外生成dump有很多好处,其中最大的好处就是不会被崩溃进程影响,这样dump的过程就不容易出错,但是这样也有一定的弊端。

1.部分崩溃无法抓取

在一些极端的崩溃,如堆栈溢出之类的崩溃,进程外抓取dump有时候会失败。

2.无法抓取死锁或者其他原因导致的进程僵死

breakpad现在没有检测进程死锁的代码,也没有在服务端控制客户端请求dump的代码,所以现在breakpad无法抓取死锁等进程僵死的问题。不过因为breakpad的定位是处理崩溃,如果有这种需要的童鞋,可以自行修改breakpad的代码,添加这些功能。

3.对服务端有依赖

如果指定了在使用进程外抓取dump,breakpad对服务端就有依赖。主要体现在抓取dump时,如果服务端不存在,客户端将无法正常抓取dump,甚至有时会出现阻塞。

当然对于这些问题,随着breakpad的发展肯定会越来越完善。如果,你遇到了了这些问题,而又绕过不了,那就改代码,并且提交给breakpad吧,开源项目就是这么发展的。

好,到此breakpad的Windows实现就已经说完了,如果有神马问题,还请多多指教。谢谢大家。

转帖:http://www.cppblog.com/lauer3912/archive/2011/11/07/159785.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: