breakpad是Google开源的一套跨平台工具
windows下捕获dump之Google breakpad_client的理解
breakpad是Google开源的一套跨平台工具,用于dump的处理。很全的一套东西,我这里只简单涉及breakpad客户端,不涉及纯文本符号生成,不涉及dump解析。
一、使用
最简单的是使用进程内dump捕获,使用者只需要跟ExceptionHandler打交道,在自己的程序里定义一个ExceptionHandler对象,ExceptionHandler会挂上异常处理、CRT参数错误处理、purecall错误处理,当发生crash时,breakpad会写好dump,然后回调通知使用者。进程内dump并不推荐,但也不算太差,它在程序启动时就开启了一个“Handler thread”,等到有crash,触发该线程去写dump,写完回调使用者,从google的久未更新的ClientDesign文档可以猜到以前是只有进程内写dump的,它已经符合了让dump尽可能真实而设置下的规定。以前所在团队在chromium上做二次开发,使用的是进程内dump,没发现有问题。现在我安装的chrome浏览器,没发现有crash_server进程,估计要么是没抓dump,要么是进程内dump,我看到有文章说有一个GoogleCrashHandler.exe进程,但我这里没有发现,可能是后来修改掉了吧,之前我还一直以为是对crash_server.exe重命名了。
进程外写dump,使用者一样要定义一个ExceptionHandler对象,这对象有管道名称。另外还需要写一个server进程,server进程负责:写dump、上传dump,当客户进程发生crash时,只需要通过Event置位通知服务进程。server进程只需要定义一个breakpad提供的CrashGenerationServer类对象。客户进程和服务进程是通过管道通信的,通信可以只发生在客户进程初始化阶段,server进程要先于客户进程启动,否则客户进程就会因为管道连接不上而使用进程内dump捕获。
进程内、外dump捕获,都是异步而阻塞的,异步具体是说,进程内dump会让写dump、回调通知使用者写dump完成在另一个安全的线程中做;进程外dump会让写dump在另一个进程中做、回调通知写dump完成在crash线程中做、dump上传可以放到另一个进程中做。阻塞具体是说,虽然发生crash的线程把dump相关的工作扔给别人做了,但是它会等待别人的工作做完才继续完下走。
二、内部实现
ExceptionHandler部分。
当使用进程内dump时,会有一个handler thread,该线程启动之后,等待semaphore触发写dump行为,进程外dump则没有该线程。另外,异常处理初始化是在ExceptionHandler对象构造中做的,如果没有进程外dump的需求,那么只需要ExceptionHandler就可以搞定,不需要CrashGenerationClient 和 CrashGenerationServer。
可以看到breakpad客户端主要包含了CrashGenerationServer\ExceptionHandler\CrashGenerationClient三部分,另外有dump上传未画出。
三、从代码中学到的
学习breakpad_client的代码,不是为了在工作上使用,以前的、现在的团队都已经有成熟的dump捕获、dump分析工具。学习它,是为了体会它的优点和缺点。
breakpad_client的层次划分很好,使用者不需要知道进程间通信的存在,通过回调实现层次间的通知。(这种比较简单,一般人都可以做到。)
crash之后崩溃线程尽可能少的操作,在客户进程初始化时就把崩溃时服务进程需要用的全局数据的地址通知服务进程,崩溃时,只需要触发Event。(我之前的做法是在crash的时候再把崩溃信息通知服务进程,现在看来是不合理的。)
API的使用。RegisterWaitForSingleObject的使用,这个API是我之前没用过的,非常方便,直到前阵子才通过QueueUserWorkItem API(chromium通过它异步上传dump)知道windows有自带线程池的存在;进程间通信对管道+Event的善用;dump生成的各种处理,不仅仅是MiniDumpWriteDump。(这可以说是我知识面不广带来的惊喜。)
阅读ClientDesign文档,虽然文档可能老了,但引导我明白了为什么进程内dump会导致现场破坏,最直接的理解是:因为堆坏了导致的崩溃,这时候异常处理函数里又干了堆内存分配的事情,那肯定就又继续crash。
breakpad_client对使用者的通知是用回调函数做的,回调函数是在对象初始化时传递的函数指针,有一个函数有三个回调函数指针(客户进程连接、客户进程崩溃、客户进程要求上传dump), 我更喜欢用抽象类指针,这样子只需要一个指针就够了,参数不需要那么多,而且代码更像C++。(这是目前唯一能想到的不喜欢。)
四、资料推荐
http://code.google.com/p/google-breakpad/wiki
breakpad是Google开源的一套跨平台工具的更多相关文章
- 【Protocol Buffers】grpc默认使用的Google 开源的一套成熟的结构数据序列化机制
grpc默认使用的Google 开源的一套成熟的结构数据序列化机制 参考地址:https://blog.csdn.net/shensky711/article/details/69696392 参考地 ...
- google开源的C++性能分析工具 - gperftools
gperftools是Google提供的一套工具,其中的一个功能是CPU profiler,用于分析程序性能,找到程序的性能瓶颈. 安装 gperftools:http://code.google.c ...
- (视频) 开源,免费和跨平台 - MVP ComCamp 2015 KEYNOTE
2015年1月31日,作为KEYNOTE演讲嘉宾,我和来自全国各地的开发人员分享了作为一名MVP的一些体会. Keynote – Open Source, Free Tools and Cross P ...
- 转:玩转Google开源C++单元测试框架Google Test系列
转自http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Google ...
- 玩转Google开源C++单元测试框架Google Test系列(转载)
越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/ ...
- 开源,免费和跨平台 - MVP ComCamp 2015 KEYNOTE
2015年1月31日,作为KEYNOTE演讲嘉宾,我和来自全国各地的开发人员分享了作为一名MVP的一些体会. Keynote – Open Source, Free Tools and Cross P ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(转)
转自:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Googl ...
- [转]Google开源Leak Finder—用于检测内存泄漏的JavaScript工具-----可惜,暂时打不开google的网站,下载不了
近日,Google开源了Leak Finder,这款工具可以查看JavaScript应用的堆,进而发现内存泄漏. 作为一门垃圾收集语言,JavaScript并不会出现常见的内存泄露情况,特别是像C++ ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
原文地址:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Goo ...
随机推荐
- java_tomcat_the_APR based Apache Tomcat 小喵咪死活启动报错_临时方案
报错信息如下: 信息: The APR based Apache Tomcat Native library which allows optimal performance in productio ...
- java 字符串反转
描述:给我一个字符串,例如I love java,输出: java love I 方法一 public class StringReverse { public void swap(char[] ...
- IOS中 init和initialize
一.init和initialize 1.方法类型 1> init属于对象方法,-开头 2> initialize属于类方法,+开头 2.调用时刻 1> init:每个对象初始化的时候 ...
- Linux 经常使用 性能 检测 命令 说明
1.uptime [root@smgsim02 ~]# uptime 15:08:15 up 98 days, 4:19, 2 users, load average: 0.07, 0.29, ...
- ShellExecute函数简单说明
平时在delphi写代码的过程中总是能遇到ShellExecute函数,于是索性将它的使用方法整理一下,由于我在微软的站点上也没能查到个详解(当然我查的中文版,俺菜嘛) ShellExecute函数原 ...
- [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop參数
本文翻译自Elasticsearch官方指南的Proximity Matching一章. 邻近匹配(Proximity Matching) 使用了TF/IDF的标准全文搜索将文档,或者至少文档中的每一 ...
- 把VBScript的函数迁移到C#.NET
原文:把VBScript的函数迁移到C#.NET VBScript 5.6 Functions C# code Abs System.Math.Abs Array New Object() { } A ...
- 顶级jQuery树插件
顶级jQuery树插件 顶级jQuery树插件 2013-03-05 17:20 139人阅读 评论(0) 收藏 举报 jsTree JsTree是一个基于jQuery的Tree控件.支持HTML.J ...
- Web神器WebStorm 8.0测试版发放(慧都独家)
WebStorm 8.0测试版的发放,标志着WebStorm规划构建的发展成熟. 此次WebStorm 8.0测试版的主要变化是支持高级的AngularJS和集成Spy-js JavaScript跟踪 ...
- 【SSH三个框架】Hibernate第八部分基础:经营-many关系
在Hibernate在-many关系.它通常不使用.由于当数据库查询复杂度太高时. 我们在这里做的是学生和教师,学生可以有多个老师,教师可以有多个学生. watermark/2/text/aHR0cD ...