zoukankan      html  css  js  c++  java
  • 妙用perfmon Alert抓dump

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

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

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

    创建Alert

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

    image_thumb

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

    image

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

    image

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

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

    image

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

    image

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

    定义任务

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

    image

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

    image

    然后,修改参数为下图:

    image

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

    创建windows计划任务

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

    image

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

    image

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

    image

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

    然后切换到Actoin这个tab上

    image

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

    image

    请看这段:

    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来做。但是没必要……

  • 相关阅读:
    SQL Server执行计划的理解
    SQL Server Profiler工具
    利用SQL Profiler处理开销较大的查询
    查询开销
    详解索引连接类型
    详解执行计划
    数据库引擎调整顾问
    six.moves的用法
    ※数据结构※→☆非线性结构(tree)☆============二叉树 顺序存储结构(tree binary sequence)(十九)
    C++ 线程的创建,挂起,唤醒,终止
  • 原文地址:https://www.cnblogs.com/teld/p/5025507.html
Copyright © 2011-2022 走看看