抓dump文件,经常是解决众多疑难杂症的不二手段。但是很多时候,我们没办法抓。比如说

  • 几秒内的线程数暴涨200个,然后迅速回落
  • 程序跑了两天,内存涨到某个数字就自己OOM了

原因不外乎都是时间短,没有办法人肉来一直看着,而且,即使盯着,你敲回车让adplus把cdb调出来,至少也要几秒钟,那时候dump很容易就抓的不准确了。怎么办?实际上,我们可以配合伟大的perfmon来抓这种dump。

创建Alert

首先打开perfmon,方式是WIN+R,输入perfmon回车即可。然后右键点击user defined

,创建一个新的dataset,比如取名叫做createDump,选择手动创建

选择下面的Alert,而不是counter log,如下图

到关键的地方了!选择你要监控的perf counter。比如我要监控某个.NET进程的managed heap,如果大于2GB,我就创建一个dump出来。

那么,选择#bytes in all heaps,如下图:

OK之后,回到上一个界面,采样时间间隔,设置为15秒。

一直按Ok,知道结束这个wizard。

定义任务

重新回到perfmon界面,点击左侧树上我们创建好的createDump,在右侧的listview中,右键选择属性

选择Alert Task,输入task的名字以及arguments。其中前者,可以手工输入。第一次提示,这个名字就是你在计划任务里面的任务名字!不是随便写的!!!第二行的参数,点击右面的大于号,选择你要处理的参数

然后,修改参数为下图:

注意,参数修改为了双引号的格式,然后用空格分开。

创建windows计划任务

按住WIN+R,输入taskschd.msc /s,启动windows计划任务

进入计划任务,点击左侧Library节点,在右侧空白处,点击右键,创建new task,注意不要选择basic task

在新建task窗口中,首先输入任务的名字。请鼠标向上滚,看前面我写的那个粗体字部分。这个名字,就是你在上面alert的task中输入的名字,两者必须要一致!否则不会被调用的。

同时要注意,一般我们要选择:Run whether use is logged on or not,而不是默认的logged on only

然后切换到Actoin这个tab上

点击new,创建一个新的action。注意下面的optional的arguments,这里是第二个坑!务必要写$(Arg0),否则你的程序接受不到参数!

请看这段:

If the task to run is a script, you must set the task arguments in the Task Scheduler to $(Arg0); otherwise, the arguments that you specify with this property will not be passed to the script.

原文出处,请戳这里

写你自己的createDumpTask程序

这里写了一个简单的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace CreateDumpTask
{
    class Program
    {
        static void Main(string[] args)
        {
                        using(StreamWriter sw = new StreamWriter("c:\\work\\1.txt",true))
            {
                sw.WriteLine("Triggered at {0}", DateTime.Now);
                sw.WriteLine("Length of arguments:{0}", args.Length);

StringBuilder sb = new StringBuilder();
                foreach (string arg in args)
                {
                    sb.Append(arg).Append(",");
                }

sw.WriteLine("Args:{0}", sb.ToString());
            }
        }
    }
}

而实际上,你要增加自己的逻辑,比如,持续三分钟内,触发了三次,那么可以抓一个dump出来。而抓dump的方式,最简单的就是复制一个别的server上安装好的windbg到你指定目录下,比如c:\windbg目录下。

然后代码中,用Process.Start来调用adplus.exe或者adplus_old.vbs来抓dump文件。

当然,复杂一点,你也可以用dbgeng.dll,然后PInvoke来做。但是没必要……

妙用perfmon Alert抓dump的更多相关文章

  1. 高通平台如何使用QPST抓DUMP

    一 :确认手机状态 手机系统死机白屏后,使用USB线 连接手机和计算机.打开计算机设备管理器 ,当其中与手机相关的端口只有DIAG 口 项(9006端口)时,表明手机处于DUMP 模式,可以抓DUMP ...

  2. .NET程序崩溃了怎么抓 Dump ? 我总结了三种方案

    一:背景 1. 讲故事 最近几天接到了几个crash的求助,可能这几个朋友没玩过怎么去生成dump,只能手把手教,感觉也不是一个办法,所以有必要总结一下,后续再有朋友咨询的话,我就可以把这篇文章丢过去 ...

  3. WinDbug抓取进程dump

    安装WinDbug(包含在 Windows Kits-debugger 中)后,运行如下命令将会在 explorer.exe进程发生崩溃后抓取相应的内存数据到D盘根目录下的一个文件夹中 adplus. ...

  4. WinDbg抓取程序报错dump文件的方法

    程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...

  5. 抓取Dump文件的方法和工具介绍

    一.Windows系统的任务管理器里抓dump 启动任务管理器,选中某个进程,右键,弹出菜单"创建转储文件" 注意事项: 当你在64位Windows系统上抓32位进程的dmup文件 ...

  6. windows下捕获dump之Google breakpad_client的理解

    breakpad是Google开源的一套跨平台工具,用于dump的处理.很全的一套东西,我这里只简单涉及breakpad客户端,不涉及纯文本符号生成,不涉及dump解析. 一.使用 最简单的是使用进程 ...

  7. windows下捕获dump

         一般要捕获异常只需要两个函数:SetUnhandledExceptionFilter截获异常:MiniDumpWriteDump写dump文件.但是由于CRT函数可能会在内部调用SetUnh ...

  8. Dump Checking

    Dump Checking Debug相关的一些小技巧 摘要: 1. 如何Debug一个进程的子进程? 答: 使用WinDBG attach到父进程, 然后输入命令".childdbg 1& ...

  9. 妙味课堂:JavaScript初级--第11课:字符串、查找高亮显示

    1.数字字母 Unicode 编码 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content- ...

随机推荐

  1. Cocos2d-x精华教程汇总(第三期) cocos2d-x最新离线API文档下载(最新版3.6更新。。。)

    其实使用doxygen在Cocos2d-x引擎的doc目录下可以生成离线文档,但是可能每个人为了生成一个离线文档去安装甚至编译doxygen毕竟麻烦,而且现有的doxygen无法生成多语言版本的离线文 ...

  2. Harris角点检测算原理

    主要参考了:http://blog.csdn.net/yudingjun0611/article/details/7991601  Harris角点检测算子 本文将该文拷贝了过来,并做了一些数学方面的 ...

  3. VS2010添加默认路径,库以及Lib

    下面以OpenCV为例,不需要每次打开VS2010都手动添加OpenCV的库和lib,具体方法如下: VC++目录 步骤一:用任意文本编辑器打开:  VS安装目录中的\VC\VCWizards\def ...

  4. 在mysql数据库中关于日期时间字段的处理

    在mysql数据库中关于日期时间字段的处理 在开发中,日期时间字段一般有如下几种设计 假设要获取2013-08-15日到2013-08-16日之间的记录 1. 直接使用日期时间类字段 相关sql语句如 ...

  5. [置顶] quartznet任务调度和消息调度(JAVA与C#版对比)

    quartznet任务调度和消息调度 1.  作用 自动执行任务. 2.  下载地址 NET版本 JAVA版本 1下载 http://quartznet.sourceforge.net/downloa ...

  6. win7问题解决,凭据管理器和无法访问,不允许一个用户使用一个以上用户名与服务器或共享资源进行多重连接。

    WIN7凭据管理器,如果你用一个帐号远程登录以后在电脑中会记住这个信息,假如你想用另外的帐号,那么就到控制面板-凭据管理器里中进行修改或者删除. 如果你登录以后提示,“无法访问.不允许一个用户使用一个 ...

  7. Source not found for StandardEngine(ContainerBase).initInternal() line: 1078

    总是这样 在复制完一个项目,并重新起了个名字后. 再打开网页就怎么也打开不了.   第一反应是tomcat出问题了. 于是有了这样的问题: Source not found for StandardE ...

  8. sscanf,sscanf_s及其相关使用方法

    #include<stdio.h> 定义函数 int sscanf (const char *str,const char * format,........); 函数说明   sscan ...

  9. jQuery插件之-瀑布流插件

    jquery.wookmark.js 一个实现瀑布流自适应宽度布局的jQuery插件—jquery.wookmark.js , wookmark使用非常简单到只需要一句代码就能实现,除此之外,当页面宽 ...

  10. ORACLE 中的 锁 介绍

    ORACLE 中的 锁 介绍 Oracle数据库支持多个用户同时与数据库进行交互,每个用户都可以同时运行自己的事务,从而也需要对并发访问进行控制.Oracle也是用“锁”的机制来防止各个事务之间的相互 ...