windows下捕获dump之守护进程

一两个月前为产品写了一个独立的exe,由于产品使用的捕获dump是一个现成的进程外exe,如果以资源的方式集成它容易出现安全警告,由于时间关系没有寻求新的解决方法,还是遵循旧方案,不捕获dump。 最近业余看了会儿breakpad client,想到一个解决方案——其实也蛮简单的,最后exe大概会增加200多KB。下边从头分析。

  有这样一种需求,希望一个进程启动之后,有另一个进程来“守护”它,当它发生crash时,能生成dump,然后把它重启;还有一个要求,“守护”进程跟工作进程必须是在同一个物理文件里,就像chromium一样,它是多进程的,但只有exe文件只有一个。借助breakpad client,这是很容易实现的事情,“守护”进程即是breakpad client中的服务进程,工作进程即是breakpad client中的客户进程。

一、思路

1、dump捕获,基于breakpad client。

2、守护,在breakpad服务进程的客户端crash回调里重启工作进程(不能直接做重启,需要做些简单处理)。

3、一个物理文件多种功能进程,代码都放在一个物理文件里,不同类进程根据命令行参数做区分。

二、需要注意的问题  

1、首先启动的是工作进程,由工作进程启动守护进程,工作进程需要等待守护进程的初始化完毕(主要是用于进程通信的管道)才开始注册异常处理。现在我看到的chromium代码,没有使用进程外dump,所以没有等待逻辑。

2、工作进程没有后退策略,当守护进程被异常结束时,客户进程崩溃就没法处理了,可以考虑在客户进程的crash回调做处理,但这种处理是在crash线程做的,最好是让异常处理的安全线程在进程外dump触发的情况下仍然启动,作为后备策略,demo暂不考虑这特殊情况。 

3、进程crash之后,全局C++对象的析构函数不会被调用。 

4、守护进程在重启工作进程之前,需要等到工作进程已经退出、守护进程的管道已经停止,才能重启。

三、实现

1、工作进程启动守护进程时,加上命令行参数crash_server=XXX,XXX为GUID Event名,守护进程启动之后置位该Event,工作进程等待该Event置位再继续往下执行。

2、crash发生时,守护进程的主线程等待客户进程退出;接着主线程析构crash_server、启动客户进程;接着主线程等待工作线程的dump上传完毕;最后退出主线程。crash没有发生时:守护进程在主线程等待客户进程退出后退出。

3、chromium的crash_service.cc 为防止server进程上传dump时主线程突然退出,做了几个防止措施:(1)、在客户进程退出时,sleep 1000毫秒给dump上传函数执行的机会,然后再给自己发送WM_CLOSE消息;(2)、dump上传函数跟CrashService类的析构函数有临界区锁,当上传函数未执行完毕时,CrashService不会析构,所以主线程也就不会先退出。我写的demo,守护进程没有创建窗口,也不使用WM_CLOSE消息。

4、chromium也有重启机制,可以在breakpad_win.cc中看到,是在客户进程的crash回调中做的。

部分代码:

Process Entry:

 

Guard process Main Function:

 

Work Process Main Function:

 

四、总结

  本demo的主要难点是在细节的考虑上,思路是比较简单的。breakpad的使用极其方便;一个物理文件多个功能进程的思路也很常见。

五、一些基础

  当然就是breakpad client代码了,我做了一些学习分享放在:

《windows下捕获dump》http://www.cnblogs.com/cswuyg/p/3207576.html

《windows下捕获dump之Google breakpad_client的理解》http://www.cnblogs.com/cswuyg/p/3286244.html

  breakpad client的学习代码可从https://github.com/cswuyg/google_breakpad_client下载到。

原文地址:https://www.cnblogs.com/lidabo/p/12125541.html

时间: 2024-11-10 14:57:14

windows下捕获dump之守护进程的相关文章

windows下bat批处理实现守护进程(有日志)

开发部的一个核心程序总是会自己宕机,然后需要手工去起,而这个服务的安全级别又很高,只有我可以操作,搞得我晚上老没法睡,昨晚实在受不了了,想起以前在hp-ux下写的shell守护进程,这回搞个windows下的bat版守护程序吧,当时晚上思路已经很迟钝了,就叫了个兄弟让他写了,上去后运行效果不错,至少昨晚我安心睡了7小时. 早上来把程序改完善一些,增加了记录等功能. 实现: 检查是否有notepad,要用的话就算成自己的进程名,如果进程宕了就过会自动重启(会在当前目录下生成一个start.bat)

windows下bat批处理实现守护进程

本文转自网络,由于找不到原作者,因而无法知道出处.如果有幸让原作者看到,请联系我加上.先转载至此. 最近几天加班加疯掉了,天天晚上没法睡.开发部的一个核心程序总是会自己宕机,然后需要手工去起,而这个服务的安全级别又很高,只有我可以操作,搞得我晚上老没法睡,昨晚实在受不了了,想起以前在hp-ux下写的shell守护进程,这回搞个windows下的bat版守护程序吧,当时晚上思路已经很迟钝了,就叫了个兄弟让他写了,上去后运行效果不错,至少昨晚我安心睡了7小时. 早上来把程序改完善一些,增加了记录等功

Windows下获取Dump文件以及进程下各线程调用栈的方法总结(转)

1. Dump文件的用途 Dump文件, 主要用于诊断一个进程的运行状态,尤其是碰到崩溃(Crash)或者挂起(hang)不响应时,需要分析它的工作状态.  除了平时常见的attach到这个进程, 分析Dump文件就成了一个重要的手段了. 相信一些做软件维护和支持的工程师在这方面深有体会, 比如某天某时,客户说, 呀, 糟糕, 服务器进程挂掉了, 怎么回事? 然后,看看了日志文件,也没有什么可用的信息.  技术支持告诉他, 按某步骤生成一个dump文件来看看...... 2. 如何生成Dump文

windows下 管理员身份启动java进程

winXp,win2003等老操作系统没有区分管理员身份启动cmd运行程序, win vista,7之后的windows操作系统都有是否以管理员身份启动cmd运行程序.官方的说法是为了安全性.java 项目主服务另外启动一个进程一般用 Runtime.getRuntime().exec(command)来启动. xp,2003系统中一般不会有问题, win7之类的就会提示权限不够,必须以管理员身份运行程序. 查了下,可以通过nircmd这个工具来执行,官网下载zip(http://www.nir

ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)

原文:ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识) 前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程,来保证我们的程序在异常或者是电脑重启的时候仍然能够正常访问. 如果你以后用准备使用 asp.net core来开发项目的话,程序并且部署到 Linux 上的话,那么此篇文章你值得收藏. 如果你觉得对你有帮助的话

Windows下生成dump文件方法

[转载请注明出处]:http://blog.csdn.net/longlong530 一. 背景 没人能保证自己的软件在各种未知环境运行下,会木有任何问题.那么如果程序崩溃了怎么办?看日志?日志不全又怎么办?日志能帮你定位的多细致呢?如果能有种方法记录程序最后工作的状态,比如堆栈调用情况等,那么我们就可以获悉"它是如何挂掉的~" 二. 调研 我们对程序bug引起的程序崩溃的五种定位方法进行了调研,并最终选择方案5为我所在项目使用的程序崩溃定位方案. 方案1: 崩溃地址 + MAP文件

ASP.ENT Core Linux 下 为 donet创建守护进程(转载)

原文地址:http://www.cnblogs.com/savorboard/p/dotnetcore-supervisor.html 前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程,来保证我们的程序在异常或者是电脑重启的时候仍然能够正常访问. 如果你以后用准备使用 asp.net core来开发项目的话,程序并且部署到 Linux 上的话,那

ansible 部署基于windows 2008 r2+rsync+alwaysUp(守护进程)

准备:升级PowerShell3.0 及打开WinRM模块 参考文章:http://juestnow.blog.51cto.com/1515305/1875026 下载软件包rsync http://down.51cto.com/data/371729 alwaysUp https://www.coretechnologies.com/products/AlwaysUp/ AlwaysUpCLT https://www.coretechnologies.com/products/AlwaysUp

node.js在windows下的学习笔记(8)---进程管理Process

process是一个全局内置对象,可以在代码中的任何位置访问此对象,这个对象代表我们的node.js代码宿主的操作系统进程对象. 使用process对象可以截获进程的异常.退出等事件,也可以获取进程的当前目录.环境变量.内存占用等信息,还可以执行进程退出.工作目录切换等操作 1.当我们想要查看应用程序当前目录时,可以使用cwd函数 : process.cwd(); 2.如果需要改变应用程序目录,就要使用chdir函数了: process.chdir('目录名'); 3.stdout是标准输出流,