写一个Windows上的守护进程(7)捕获异常并生成dump

谁都不能保证自己的代码不出bug。一旦出了bug,最好是崩溃掉,这样很快就能被发现,若是不崩溃,只是业务处理错了,就麻烦了,可能很长时间之后才能被发现。

那么如果崩溃掉,怎么查错呢?

写过Windows驱动的同学应该知道,一旦崩溃,系统会生成dump文件,然后就可以根据dump文件、pdb文件、源码用windbg分析了。应用层的程序同样可以在崩溃的时候生成dump文件,只是没人帮你完成这个步骤,得自己动手。

1. API

这里涉及到的主要API就一个:MiniDumpWriteDump——生成dump文件,我说再多也没有官方权威,所以要看详情,还是请移步MSDN。其它辅助API就是设置异常处理器的函数,此处不介绍。

2. 异常类型

读过《Windows核心编程》的同学应该知道SEH——Windows结构化异常处理,当时我读了之后,就以为所有的异常都是在SEH体系内的,还接着“以为”了很多年。后来发现并不是:因为我写的捕获异常并生成dump文件的库并没有发挥应有的作用,该崩溃的地方还是崩溃了并且没有生成dump文件!

google后发现了这么一篇文章:http://www.codeproject.com/Articles/207464/Exception-Handling-in-Visual-Cplusplus

我总结一下:Windows下并非所有的异常都走SEH体系,还有CRT错误处理体系;也并不是只有异常才会导致程序退出,接收到Windows支持的几个信号也会导致程序退出,比如SIGABRT等等;有的“异常”处理器不是针对进程的,而只对当前线程有效,必须每个线程都设置处理器。

所以,要想捕获所有的“异常”,就得:

l 调用SetUnhandledExceptionFilter设置SEH异常处理函数

l 调用_set_purecall_handler设置处理纯虚函数调用导致的错误的处理函数

l 调用_set_new_handler设置new失败导致的错误的处理函数

l 调用_set_invalid_parameter_handler设置无效参数导致的错误的处理函数

l 调用signal设置信号SIGABRT、SIGINT、SIGTERM的处理函数

l 调用set_terminate设置terminate处理函数。这个只对当前线程有效

l 调用set_unexpected设置unexpected处理函数。这个也是只对当前线程有效

l 调用signal设置信号SIGFPE、SIGILL、SIGSEGV的处理函数。这个也是对当前线程有效

3. 异常信息获取

MiniDumpWriteDump 的ExceptionParam需要填充上异常信息,那么如何填充呢?

上面那篇文章已经指出了方法:用vc源码文件invarg.c中函数_invoke_watson的代码。

他代码中用的是vc8.0的源码,我是用vc2008编译的,所以就取的vc2008的源码,但是好像不用在意取哪个vc版本的源码。

4. 调试dump文件

我把生成的dump文件放在了应用程序所在目录,这样一眼就可以看出程序有没有崩溃过。一旦生成了dump文件,我们只要把二进制、pdb文件、dump文件放在一起,然后用vs打开dump文件,直接运行就可以调试了。(所以我们提交二进制的时候要把pdb也一同提交。)

我修改了下上面文章中的源码,封装成了两个函数,把我用它的测试代码测试的结果写在了代码中。

我的使用:main函数起来后,设置所有处理函数;在每个任务线程设置线程相关的处理函数。

源码:https://git.oschina.net/mkdym/DaemonSvc.git (主)&& https://github.com/mkdym/DaemonSvc.git (提升逼格用的)。

2015年11月10日星期二

写一个Windows上的守护进程(7)捕获异常并生成dump的更多相关文章

  1. 写一个Windows上的守护进程(8)获取进程路径

    写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路 ...

  2. 写一个Windows上的守护进程(6)Windows服务

    写一个Windows上的守护进程(6)Windows服务 守护进程因为要开机启动,还要高权限,所以我就把它做成Windows服务了. 关于Windows服务的官方文档,大家可以看https://msd ...

  3. 写一个Windows上的守护进程(5)文件系统重定向

    写一个Windows上的守护进程(5)文件系统重定向 在Windows上经常操作文件或注册表的同学可能知道,有"文件系统/注册表重定向"这么一回事.大致来说就是32位程序在64位的 ...

  4. 写一个Windows上的守护进程(4)日志其余

    写一个Windows上的守护进程(4)日志其余 这次把和日志相关的其他东西一并说了. 一.vaformat C++日志接口通常有两种形式:流输入形式,printf形式. 我采用printf形式,因为流 ...

  5. 写一个Windows上的守护进程(3)句柄的管理

    写一个Windows上的守护进程(3)句柄的管理 在Windows中编程,跟HANDLE打交道是家常便饭.为了防止忘记CloseHandle,我都是使用do-while-false手法: void f ...

  6. 写一个Windows上的守护进程(2)单例

    写一个Windows上的守护进程(2)单例 上一篇的日志类的实现里有个这: class Singleton<CLoggerImpl> 看名字便知其意--单例.这是一个单例模板类. 一个进程 ...

  7. 写一个Windows上的守护进程(1)开篇

    写一个Windows上的守护进程(1)开篇 最近由于工作需要,要写一个守护进程,主要就是要在被守护进程挂了的时候再把它启起来.说起来这个功能是比较简单的,但是我前一阵子写了好多现在回头看起来比较糟糕的 ...

  8. 写一个Windows服务

    做了两个和Windows服务有关的项目了,最开始的时候没做过,不懂,现在明白了许多.需要注意的是,如果不想登录什么的,最后在添加安装程序的那里选择那个字长的右键属性,把启动方式改为local syst ...

  9. 写一个限制上传文件大小和格式的jQuery插件

    在客户端上传文件,通常需要限制文件的尺寸和格式,最常用的做法是使用某款插件,一些成熟的插件的确界面好看,且功能强大,但美中不足的是:有时候会碰到浏览器兼容问题.本篇就来写一个"原生态&quo ...

随机推荐

  1. cookie自封装对象

    cookie.js(设置名值对属性时候不支持设置成前后有空格的格式,如' key'或'key ',只支持‘key’) (function initCookieClass(win){// 定义匿名函数并 ...

  2. BZOJ2739 最远点(分治 + 决策单调性)

    2739: 最远点 Time Limit: 20 Sec Memory Limit: 256 MB Description 给你一个N个点的凸多边形,求离每一个点最远的点. Input 本题有多组数据 ...

  3. C语言中的结构体和C++中的结构体以及C++中类的区别

    c++中结构体可以定义一个函数 C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. C++中的结构体和类的异同: 一. ...

  4. Stata和Matlab联合处理金融数据

    Stata是统计学专业软件,可以很方便的对数据处理,但几乎只能按照整行整列进行,而且每次只能加载一个矩阵(dta文件),如果要用到多个矩阵数据进行操作或进行复杂的循环控制,就力不从心了. 而Matla ...

  5. C语言复习--实现栈

    C #include <stdio.h> #include <stdlib.h> #define STACK_SIZE 100 typedef char TYPE; typed ...

  6. Oracle instr用法

    1:实现indexOf功能,.从第1个字符开始,搜索第1次出现子串的位置 ,) as i from dual; select instr('oracle','or') as i from dual; ...

  7. 自己动手写谷歌API翻译接口

      可以看到,利用GET请求方式,带入某些参数,就会返回一个json数组,QueryString参数如下:     同样的,我们只需要传入这三个参数,就可以获得我们想要的翻译内容,公开方法,代码如下. ...

  8. 《Programming WPF》翻译 第5章 8.我们进行到哪里了?

    原文:<Programming WPF>翻译 第5章 8.我们进行到哪里了? 样式支持你定义一个策略来设置可视化元素的依赖属性.属性的设置可以被命名以及手动或者编程方式地通过名称应用,或者 ...

  9. 一键安装IIS的点点滴滴——For所有Microsoft的操作系统(下)

    原文 http://www.cnblogs.com/cdts_change/archive/2010/03/09/1681392.html 接着上一篇的讲,下面我们将讨论Windows7.Window ...

  10. tyvj1297 小气的小B

    描述 其实你们都不知道,小B是很小气的.一天小B带着他的弟弟小B'一起去摘果子,走着走着,他们忽然发现了一颗长满了果子的树.由于弟弟长得太矮了,弟弟只有让哥哥小B帮他摘一些果子下来.哥哥小B说:&qu ...