<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Debug Diagnostic Tool</title><link>http://blogs.msdn.com/debugdiag/default.aspx</link><description>The Debug Diagnostic Tool is a tool designed to help troubleshoot performance issues with Internet Information Services (IIS).  Even though the tool was designed with troubleshooting IIS in mind it can be used to identify performance issues for any process.</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>DebugDiag v1.1 Available!</title><link>http://blogs.msdn.com/debugdiag/archive/2007/02/26/debugdiag-v1-1-available.aspx</link><pubDate>Tue, 27 Feb 2007 01:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1766183</guid><dc:creator>debugdiag</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/debugdiag/comments/1766183.aspx</comments><wfw:commentRss>http://blogs.msdn.com/debugdiag/commentrss.aspx?PostID=1766183</wfw:commentRss><description>&lt;P&gt;Version 1.1 of the Debug Diagnostic Tool is now available on the Microsoft download site (&lt;A class="" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3" target=_blank mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3"&gt;download&lt;/A&gt;).&amp;nbsp;&amp;nbsp;This version&amp;nbsp;contains many&amp;nbsp;fixes and features, including:&lt;/P&gt;
&lt;UL&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"&gt;IE7, &lt;?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /&gt;&lt;st1:place w:st="on"&gt;Vista&lt;/st1:place&gt;, and Win64 compatibility fixes &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"&gt;Leak rule improvements (dump on memory thresholds) &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"&gt;LeakTrack improvements (‘fasttrack’ feature, injection fixes) &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"&gt;Analysis improvements &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"&gt;Allow custom script in crash rule actions &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"&gt;Managed call stack resolution&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"&gt;.NET exceptions support &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"&gt;Debugger events support &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"&gt;Data access components and socket support &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: Calibri"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 8pt; FONT-FAMILY: Arial"&gt;Sample scripts included&amp;nbsp;&lt;/SPAN&gt;&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;Please contact &lt;A href="mailto:dbgdiag@microsoft.com"&gt;dbgdiag@microsoft.com&lt;/A&gt; for questions/feedback on v1.1 or feature requests for v2.0.&amp;nbsp; Your feedback helps us prioritize and allocate necessary resources for future development on the tool.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;HAPPY DEBUGGING!&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; COLOR: black; mso-list: l0 level1 lfo1; tab-stops: list .5in" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1766183" width="1" height="1"&gt;</description></item><item><title>Generate Dumps Using DebugDiag and Perfmon Counters - Control Script Samples</title><link>http://blogs.msdn.com/debugdiag/archive/2006/06/13/629624.aspx</link><pubDate>Tue, 13 Jun 2006 18:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:629624</guid><dc:creator>debugdiag</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/debugdiag/comments/629624.aspx</comments><wfw:commentRss>http://blogs.msdn.com/debugdiag/commentrss.aspx?PostID=629624</wfw:commentRss><description>&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Sample 1:&amp;nbsp; DbgSVC.Memory.Trigger&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Features:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Inject leaktrack.dll into all current and new w3wp.exe instances 
&lt;LI&gt;Dump w3wp.exe when its 'Virtual Bytes' counter reaches 1.8 GB. 
&lt;LI&gt;Multiple&amp;nbsp;varying triggers for a single process.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;&lt;/U&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Sample 2:&amp;nbsp; PerfTriggerSample&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Features:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Dump w3wp.exe when the 'Request Execution Time' counter for the 'ASP.NET' perfmon object reaches 80 seconds.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Setup for both samples:&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Backup - rename "C:\Program Files\IIS Resources\DebugDiag\Scripts\DbgSVC.vbs" to:&amp;nbsp; "DbgSVC.original" 
&lt;LI&gt;Update&amp;nbsp;- copy/paste the code from the appropriate sample code listing below into the original DbgSVC.vbs file. 
&lt;LI&gt;Modify the contents of this new DbgSVC.vbs file in notepad as needed to fit your scenario - i.e. change/add any of the following items in the scripts: 
&lt;UL&gt;
&lt;LI&gt;process names 
&lt;LI&gt;perfmon counter names 
&lt;LI&gt;perfmon counter thresholds 
&lt;LI&gt;actions to be taken when thresholds are reached 
&lt;LI&gt;(see notes at the top of the&amp;nbsp;sample code&amp;nbsp;for which line numbers to change)&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Restart the "Debug Diagnostic Service"&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Note: These scripts do not have a "Maximum Userdump Limit" like a ypical crash/hang rule does. While this script is in place and the DebugDiag service is running it will continue to create DMP's for each process that exceeds the trigger threshold. To disable this script, replace the original then restart the DebuDiag service again.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;Sample Code Listings&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;Note both samples are also available in the attached DebugDiagPerfTriggerSamples.zip file.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT style="BACKGROUND-COLOR: #ffff00" color=#000000&gt;DbgSVC.vbs code for Sample 1:&amp;nbsp; DbgSVC.Memory.Trigger&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;' Note make modifications to processes/counters/thresholds near line 107.&lt;BR&gt;' Note make modifications to the actions taken beginning at line 466.&lt;/P&gt;
&lt;P&gt;Const SymbolPath = "SRV*C:\symbols*http://msdl.microsoft.com/download/symbols"&lt;/P&gt;
&lt;P&gt;Set ServiceState = Controller.ServiceState&lt;BR&gt;Set HTTPPinger = Controller.HTTPPinger&lt;BR&gt;Set triggers = New TriggerItems&lt;/P&gt;
&lt;P&gt;Sub WriteToLog(ByVal Output)&lt;BR&gt;&amp;nbsp;Controller.Write "[" &amp;amp; Now() &amp;amp; "] "&lt;BR&gt;&amp;nbsp;Controller.Write Output &amp;amp; vbCRLF&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Function FormatString(ByVal InputString, ByVal FieldLength)&lt;BR&gt;&amp;nbsp;FormatString = InputString&lt;/P&gt;
&lt;P&gt;&amp;nbsp;If Len(InputString) &amp;lt; FieldLength Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatString = FormatString &amp;amp; Space(FieldLength - Len(InputString))&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Sub Controller_OnStart()&lt;BR&gt;&amp;nbsp;Dim NewTrigger&lt;BR&gt;&amp;nbsp;WriteToLog "DbgSvc started"&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;CreatePingURLs&amp;nbsp;&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnPerfTriggerHit(ActiveTrigger)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; triggers.Triggered ActiveTrigger&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnShutdown()&lt;BR&gt;&amp;nbsp;WriteToLog "DbgSVC stopped"&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub HandleProcess(ByVal Process, ByVal ControlScript)&lt;BR&gt;&amp;nbsp;If Process.IsDebuggerAttached Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Reload Control Script:",25) &amp;amp; " Process Name - " &amp;amp; FormatString(Process.ProcessName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;" Process ID - " &amp;amp; FormatString(Process.ProcessID, 6) &amp;amp; " Control Script - " &amp;amp; ControlScript&lt;BR&gt;&amp;nbsp;&amp;nbsp;Process.ReloadControlScript ControlScript&lt;BR&gt;&amp;nbsp;ElseIf Not Process.IsBeingDebugged Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Attach Debugger:",25) &amp;amp; " Process Name - " &amp;amp; FormatString(Process.ProcessName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;" Process ID - " &amp;amp; FormatString(Process.ProcessID, 6) &amp;amp; " Control Script - " &amp;amp; ControlScript&lt;BR&gt;&amp;nbsp;&amp;nbsp;Process.AttachToProcess ControlScript, SymbolPath, ""&lt;BR&gt;&amp;nbsp;Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Unknown Debugger:",25) &amp;amp; " Process Name - " &amp;amp; FormatString(Process.ProcessName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;" Process ID - " &amp;amp; FormatString(Process.ProcessID, 6)&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub HandleService(ByVal Service)&lt;BR&gt;&amp;nbsp;If Service.ProcessID &amp;lt;&amp;gt; 0 and Service.CurrentState = "SERVICE_RUNNING" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;ControlScript = GetControlScriptForService(Service)&lt;BR&gt;&amp;nbsp;&amp;nbsp;If ControlScript &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set Process = ProcessManager.GetProcessByProcessID(Service.ProcessID)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If Not Process Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HandleProcess Process, ControlScript&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnNewServiceFound(ByVal NewService)&lt;BR&gt;&amp;nbsp;WriteToLog FormatString("New service found:",25) &amp;amp; " Service Name - " &amp;amp; FormatString(NewService.ServiceName, 20) &amp;amp; _&lt;BR&gt;&amp;nbsp;" Process ID - " &amp;amp; FormatString(NewService.ProcessID, 6) &amp;amp; " Current State - " &amp;amp; NewService.CurrentState&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;HandleService NewService&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnServiceStateChanged(ByVal AffectedService)&lt;BR&gt;&amp;nbsp;WriteToLog FormatString("Service state changed:",25) &amp;amp; " Service Name - " &amp;amp; FormatString(AffectedService.ServiceName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;" Process ID - " &amp;amp; FormatString(AffectedService.ProcessID, 6) &amp;amp; " Current State - " &amp;amp; AffectedService.CurrentState&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;HandleService AffectedService&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnNewProcessFound(ByVal NewProcess)&lt;BR&gt;&amp;nbsp;Dim Message&lt;BR&gt;&amp;nbsp;Dim GFlags&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Message = FormatString("New process found:",25) &amp;amp; " Process Name - " &amp;amp; FormatString(NewProcess.ProcessName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;" Process ID - " &amp;amp; FormatString(NewProcess.ProcessID, 6) &amp;amp; " Process Identity - " &amp;amp; FormatString(NewProcess.ProcessIdentity, 40)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;GFlags = Controller.GetGlobalFlagForProcess(NewProcess.ProcessName)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If GFlags &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;Message = Message &amp;amp; " Global Flags - " &amp;amp; FormatString(GFlags, 12)&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If NewProcess.COMPlusPackageName &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;Message = Message &amp;amp; " MTS/COM+ package name - " &amp;amp; NewProcess.COMPlusPackageName&lt;BR&gt;&amp;nbsp;ElseIf NewProcess.WebAppPoolName &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;Message = Message &amp;amp; " Web application pool name - " &amp;amp; NewProcess.WebAppPoolName&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;WriteToLog Message&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Select Case UCase(NewProcess.ProcessName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;Case "W3WP.EXE":&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'triggers.Add &amp;lt;ProcessObject&amp;gt;, &amp;lt;InjectLeakTrack&amp;gt;, &amp;lt;Perfmon Counter Path&amp;gt;, &amp;lt;Trigger Threshold&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'triggers.Add NewProcess, True, "\Process({0})\Virtual Bytes", 1024*1024*800&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' (800 MB)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'triggers.Add NewProcess, True, "\Process({0})\Virtual Bytes", 1024*1024*1024*1.3 ' (1.3 GB)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;triggers.Add NewProcess, True, "\Process({0})\Virtual Bytes", 1024*1024*1024*1.8 ' (1.8 GB)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'triggers.Add NewProcess, True, "\Process({0})\Working Set", 1024*1024*400&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' (400 MB)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'triggers.Add NewProcess, True, "\Process({0})\Working Set", 1024*1024*600&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' (600 MB)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'triggers.Add NewProcess, True, "\Process({0})\Working Set", 1024*1024*800&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' (800 MB)&lt;BR&gt;&amp;nbsp;End Select&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;ControlScript = GetControlScriptForProcess(NewProcess)&lt;BR&gt;&amp;nbsp;If ControlScript &amp;lt;&amp;gt; "" Then HandleProcess NewProcess, ControlScript&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnProcessExited(ByVal ExitingProcess)&lt;BR&gt;&amp;nbsp;Dim Message&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Message = FormatString("Process Exited:",25) &amp;amp; " Process Name - " &amp;amp; FormatString(ExitingProcess.ProcessName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;" Process ID - " &amp;amp; FormatString(ExitingProcess.ProcessID, 6) &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If ExitingProcess.COMPlusPackageName &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;Message = Message &amp;amp; " MTS/COM+ package name - " &amp;amp; ExitingProcess.COMPlusPackageName&lt;BR&gt;&amp;nbsp;ElseIf ExitingProcess.WebAppPoolName &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;Message = Message &amp;amp; " Web application pool name - " &amp;amp; ExitingProcess.WebAppPoolName&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;WriteToLog Message&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;triggers.Remove ExitingProcess&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub StartLeakRule(ByVal ProcessID)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;Set Process = ProcessManager.GetProcessByProcessID(ProcessID)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If Process Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Start Leak Rule Failed:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatString(ProcessID, 6) &amp;amp; " Process Not Found"&lt;BR&gt;&amp;nbsp;Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;Process.InjectLeakTrack&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Leak Rule Started:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatString(ProcessID, 6)&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Sub StopLeakRule(ByVal ProcessID, ByVal RuleFolder, ByVal bUnloadLeakTrack)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;Set Process = ProcessManager.GetProcessByProcessID(ProcessID)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If Process Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Stop Leak Rule Failed:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatString(ProcessID, 6) &amp;amp; " Process Not Found"&lt;BR&gt;&amp;nbsp;Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;DumpPath = Process.CreateDump("Leak Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatString(ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If bUnloadLeakTrack Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Process.UnloadLeakTrack&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Leak Rule Stopped:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatString(ProcessID, 6)&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpAllIISProcesses(ByVal RuleFolder)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;For each Process in ProcessManager&lt;BR&gt;&amp;nbsp;&amp;nbsp;ProcessName = UCase(Process.ProcessName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;Select Case ProcessName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "INETINFO.EXE", "MTX.EXE", "DLLHOST.EXE", "DLLHST3G.EXE", "W3WP.EXE", "ASPNET_WP.EXE"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpPath = Process.CreateDump("IIS Hang Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatString(Process.ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;End Select&lt;BR&gt;&amp;nbsp;Next&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpProcess(ByVal RuleFolder, ByVal TargetName)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;For each Process in ProcessManager&lt;BR&gt;&amp;nbsp;&amp;nbsp;ProcessName = UCase(Process.ProcessName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If ProcessName = UCase(TargetName) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpPath = Process.CreateDump("IIS Hang Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatString(Process.ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;Next&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpCOMPlusApp(ByVal RuleFolder, ByVal TargetName)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;For each Process in ProcessManager&lt;BR&gt;&amp;nbsp;&amp;nbsp;PackageName = UCase(Process.COMPlusPackageName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If PackageName = UCase(TargetName) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpPath = Process.CreateDump("IIS Hang Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatString(Process.ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;Next&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpWebAppPool(ByVal RuleFolder, ByVal TargetName)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;For each Process in ProcessManager&lt;BR&gt;&amp;nbsp;&amp;nbsp;AppPoolName = UCase(Process.WebAppPoolName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If AppPoolName = UCase(TargetName) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpPath = Process.CreateDump("IIS Hang Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatString(Process.ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;Next&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpProcessID(ByVal RuleFolder, ByVal TargetPID)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;Set Process = ProcessManager.GetProcessByProcessID(TargetID)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;DumpPath = Process.CreateDump("IIS Hang Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;FormatString(Process.ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpNTService(ByVal RuleFolder, ByVal TargetName)&lt;BR&gt;&amp;nbsp;Set ServiceManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;For each NTService in ServiceManager&lt;BR&gt;&amp;nbsp;&amp;nbsp;ServiceName = UCase(NTService.ServiceName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If ServiceName = UCase(TargetName) And NTService.ProcessID &amp;lt;&amp;gt; 0 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpProcessID RuleFolder, NTService.ProcessID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exit For&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;Next&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnHTTPPingError(ByVal FailedURL)&lt;BR&gt;&amp;nbsp;WriteToLog FormatString("HTTP Ping Error:",25) &amp;amp; " Ping URL - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FailedURL.URL &amp;amp; " Status Code - " &amp;amp; FailedURL.LastStatusCode &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Status Text - " &amp;amp; FailedURL.LastStatusText&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnHTTPPingTimeout(ByVal TimedOutURL)&lt;BR&gt;&amp;nbsp;WriteToLog FormatString("HTTP Ping Timeout:",25) &amp;amp; " Ping URL - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;TimedOutURL.URL &amp;amp; " Timeout(secs) - " &amp;amp; TimedOutURL.TimeoutInterval&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;HandleIISHangRule TimedOutURL&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Function GetControlScriptForService(ByVal Service)&lt;BR&gt;&amp;nbsp;GetControlScriptForService = ""&lt;BR&gt;&amp;nbsp;ServiceName = UCase(Service.ServiceName)&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Function GetControlScriptForProcess(ByVal Process)&lt;BR&gt;&amp;nbsp;GetControlScriptForProcess = ""&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Sub CreatePingURLs()&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub HandleIISHangRule(ByVal TimedOutURL)&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;'----------------------------------------------------------------------------&lt;BR&gt;'Modified Code - Start&lt;BR&gt;Class TriggerItem&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private m_processName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public CounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public CounterLimits&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ProcessID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public ProcessIndex&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public TriggerID&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;Private Sub Class_Initialize&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_processName = ""&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CounterPath&amp;nbsp;&amp;nbsp; = ""&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CounterLimits = Array()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessIndex&amp;nbsp; = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TriggerID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0&lt;BR&gt;&amp;nbsp;End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Public Sub AddLimit(ByVal limit)&lt;BR&gt;&amp;nbsp;&amp;nbsp;ReDim Preserve CounterLimits(UBound(CounterLimits) + 1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;CounterLimits(UBound(CounterLimits)) = limit&lt;BR&gt;&amp;nbsp;End Sub&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Public Sub RemoveFirstLimit()&lt;BR&gt;&amp;nbsp;&amp;nbsp;If UBound(CounterLimits) = 0 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;CounterLimits = Array()&lt;BR&gt;&amp;nbsp;&amp;nbsp;Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;newLimits = Array(UBound(CounterLimits) - 1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;For i = 0 To UBound(newLimits)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newLimits(i) = CounterLimits(i + 1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;CounterLimits = newLimits&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Property Get LimitCount&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LimitCount = UBound(CounterLimits) + 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Property Get ProcessName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessName = m_processName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Property Let ProcessName(ByVal value)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_processName = LCase(value)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Property&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;End Class&lt;/P&gt;
&lt;P&gt;Class TriggerItems&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private m_processes&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Private Sub Class_Initialize&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set m_processes = CreateObject("Scripting.Dictionary")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Create a fictitious trigger to avoid hanging DbgSvc.exe when triggers are empty.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Controller.PerfWatcher.CreatePerfTrigger "\Process(foo)\Working Set", False, 1024*1024*1024*5, 1&lt;BR&gt;&amp;nbsp;End Sub&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Private Function GetDictionary(ByVal processName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set GetDictionary = Nothing&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; processName = LCase(processName)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If m_processes.Exists(processName) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set GetDictionary = m_processes.Item(processName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;End Function&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub LogTriggerInfo(ByVal message, ByRef trigger)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;WriteToLog message &amp;amp; vbCRLF &amp;amp; _&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"&amp;nbsp; PerfTriggerID = "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp; trigger.PerfTriggerID &amp;amp; vbCrLf &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"&amp;nbsp; CounterPath = "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp; trigger.CounterPath &amp;amp; vbCrLf &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"&amp;nbsp; TriggerIfAbove = "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp; trigger.TriggerIfAbove &amp;amp; vbCrLf &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"&amp;nbsp; Limit = "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp; trigger.Limit &amp;amp; vbCrLf &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"&amp;nbsp; LastValue = "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp; trigger.LastValue &amp;amp; vbCrLf &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"&amp;nbsp; SecondsOutsideLimit = " &amp;amp; trigger.SecondsOutsideLimit&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub Add(ByRef process, ByVal injectLeakTrack, ByVal counterPath, ByVal limit)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set items = GetDictionary(process.ProcessName)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If items Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set items = CreateObject("Scripting.Dictionary")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_processes.Add LCase(process.ProcessName), items&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not items.Exists(process.ProcessID) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If injectLeakTrack Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;process.InjectLeakTrack&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog "Injected LeakTrack.dll into PID:" &amp;amp; process.ProcessID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perfmonName = LCase(Left(process.ProcessName, Len(process.ProcessName) - 4))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If InStr(counterPath, "{0}") &amp;gt; 0 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If items.Count &amp;gt; 0 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; perfmonName = perfmonName &amp;amp; "#" &amp;amp; CStr(items.Count)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; counterPath = Replace(counterPath, "{0}", perfmonName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set trigger = Controller.PerfWatcher.CreatePerfTrigger(counterPath, True, limit, 1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LogTriggerInfo "New trigger has been created:", trigger&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set itm&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = New TriggerItem&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.CounterPath&amp;nbsp; = trigger.CounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.TriggerID&amp;nbsp;&amp;nbsp;&amp;nbsp; = trigger.PerfTriggerID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.ProcessName&amp;nbsp; = process.ProcessName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.ProcessID&amp;nbsp;&amp;nbsp;&amp;nbsp; = process.ProcessID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.ProcessIndex = items.Count&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.AddLimit(limit)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; items.Add process.ProcessID, itm&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set itm = items.Item(process.ProcessID)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;itm.AddLimit(limit)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub Remove(ByRef process)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'When a process exits, the perf triggers don't change at all.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' ... so we need to do a shift, delete or re-add of various&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' triggers to keep the PID's and triggers matched up.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set items = GetDictionary(process.ProcessName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not items Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If items.Exists (process.ProcessID) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set removing = items.Item(process.ProcessID)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; items.Remove process.ProcessID&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lastCounterPath&amp;nbsp; = removing.CounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lastTriggerID&amp;nbsp;&amp;nbsp;&amp;nbsp; = removing.TriggerID&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; savedCounterPath = lastCounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; savedTriggerID&amp;nbsp;&amp;nbsp; = lastTriggerID&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; keys = items.Keys&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For i = removing.ProcessIndex To UBound(keys)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set itm = items.Item(keys(i))&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; savedCounterPath = itm.CounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; savedTriggerID&amp;nbsp;&amp;nbsp; = itm.TriggerID&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If (itm.TriggerID &amp;lt;&amp;gt; -1) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If (lastTriggerID &amp;lt;&amp;gt; -1) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Shift path&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.CounterPath = lastCounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Shift Trigger&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.TriggerID&amp;nbsp;&amp;nbsp; = lastTriggerID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else'(lastTriggerID = -1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Shift path&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.CounterPath = lastCounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Create a new trigger&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteToLog "Re-adding """ &amp;amp; itm.CounterPath &amp;amp; """ because it matches PID:" &amp;amp; itm.ProcessID &amp;amp; " which has not hit its trigger limit"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set trigger = Controller.PerfWatcher.CreatePerfTrigger(itm.CounterPath, True, itm.CounterLimits(0), 1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.TriggerID = trigger.PerfTriggerID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If (itm.TriggerID = -1) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If (lastTriggerID &amp;lt;&amp;gt; -1) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Shift path&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.CounterPath = lastCounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Delete trigger&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteToLog "Removing """ &amp;amp; itm.CounterPath &amp;amp; """ because it matches PID:" &amp;amp; itm.ProcessID &amp;amp; " which already hit its trigger limit"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Controller.PerfWatcher.RemovePerfTrigger lastTriggerID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else'(lastTrigger = -1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Shift path&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.CounterPath = lastCounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Don't do anything with triggers&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.ProcessIndex = i&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lastCounterPath&amp;nbsp; = savedCounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lastTriggerID&amp;nbsp;&amp;nbsp;&amp;nbsp; = savedTriggerID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Okay... we've gone through the whole list for this particular processName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'The last one in the list will always have the highest CounterPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Remove it otherwise the shifting we just did will leave this without a matching PID.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If lastTriggerID = -1 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteToLog "Cannot remove trigger for """ &amp;amp; lastCounterPath &amp;amp; """ because it was previously removed."&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteToLog "Removing highest trigger """ &amp;amp; lastCounterPath &amp;amp; """ to account for exiting process"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Controller.PerfWatcher.RemovePerfTrigger lastTriggerID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub Triggered(ByRef trigger)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'There is no information in the DebugDiag trigger that tells us what PID just exceeded the trigger.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Iterate through all the TriggerItems to find the matching TriggerID so we can create a DMP based on the right PID.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each process in m_processes.Items&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each itm in process.Items&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If CInt(itm.TriggerID) = CInt(trigger.PerfTriggerID) Then&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LogTriggerInfo "OnPerfTriggerHit fired for PID:" &amp;amp; itm.ProcessID, trigger&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Controller.PerfWatcher.RemovePerfTrigger itm.TriggerID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; itm.RemoveFirstLimit()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If itm.LimitCount = 0 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog "No additional limits for PID:" &amp;amp; itm.ProcessID &amp;amp; ". Removing its trigger(s)."&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;itm.TriggerID = -1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set ActiveProcess = Controller.Processes.GetProcessByProcessID(itm.ProcessID)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpName = ActiveProcess.CreateDump("PerfTrigger_Fired")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog "Created dump file " &amp;amp; DumpName&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If itm.LimitCount &amp;gt; 0 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set trigger = Controller.PerfWatcher.CreatePerfTrigger(itm.CounterPath, True, itm.CounterLimits(0), 1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;itm.TriggerID = trigger.PerfTriggerID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LogTriggerInfo "PID:" &amp;amp; itm.ProcessID &amp;amp; " has additional limits configured. Creating trigger for next limit:", trigger&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Sub&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;BR&gt;End Class&lt;/P&gt;
&lt;P&gt;'Modified Code - End&lt;BR&gt;'----------------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT style="BACKGROUND-COLOR: #ffff00" color=#000000&gt;DbgSVC.vbs code for Sample 2:&amp;nbsp; PerfmonTriggerSample&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;' Note make modifications to processes/counters/thresholds at line 61.&lt;BR&gt;' Note make modifications to the actions taken beginning at line 83.&lt;/P&gt;
&lt;P&gt;Const SymbolPath = "SRV*C:\symbols*http://msdl.microsoft.com/download/symbols"&lt;/P&gt;
&lt;P&gt;Set ServiceState = Controller.ServiceState&lt;BR&gt;Set HTTPPinger = Controller.HTTPPinger&lt;/P&gt;
&lt;P&gt;Sub WriteToLog(ByVal Output)&lt;BR&gt;&amp;nbsp;Controller.Write "[" &amp;amp; Now() &amp;amp; "] "&lt;BR&gt;&amp;nbsp;Controller.Write Output &amp;amp; vbCRLF&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Function FormatString(ByVal InputString, ByVal FieldLength)&lt;BR&gt;&amp;nbsp;FormatString = InputString&lt;/P&gt;
&lt;P&gt;&amp;nbsp;If Len(InputString) &amp;lt; FieldLength Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatString = FormatString &amp;amp; Space(FieldLength - Len(InputString))&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Sub Controller_OnStart()&lt;BR&gt;&amp;nbsp;Dim NewTrigger&lt;BR&gt;&amp;nbsp;WriteToLog "DbgSvc started"&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;CreatePingURLs&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If ServiceState("PERFLOG_INTERVAL") = 0 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;ServiceState("PERFLOG_INTERVAL") = 60 * 5&amp;nbsp;' Default hardcoded sampling interval = 5 minutes&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Set PerfLog = Controller.PerfLog&lt;BR&gt;&amp;nbsp;PerfLog.Interval = ServiceState("PERFLOG_INTERVAL")&lt;/P&gt;
&lt;P&gt;&amp;nbsp;If ServiceState("DISABLE_PERFLOG") &amp;lt;&amp;gt; 1 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;On Error Resume Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;' These counters could be missing from the system if IIS and/or ASP.Net is not installed&lt;BR&gt;&amp;nbsp;&amp;nbsp;' In Win2K3 there is no TCP object! Instead there are TCPv4 and TCPv6.&lt;BR&gt;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "\ASP.NET\*"&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "\Active Server Pages\*"&lt;BR&gt;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "\Web Service(*)\*"&lt;BR&gt;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "\TCP\*"&lt;BR&gt;&amp;nbsp;&amp;nbsp;If Err.Number &amp;lt;&amp;gt; 0 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Only add these counters if TCP failed (Win2K3)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "\TCPv4\*"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "\TCPv6\*"&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "&lt;A href="file://Internet/"&gt;\\Internet&lt;/A&gt; Information Services Global\\*"&lt;BR&gt;&amp;nbsp;&amp;nbsp;On Error Goto 0&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "\Memory\*"&lt;BR&gt;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "\Process(*)\*"&lt;BR&gt;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "\Processor(*)\*"&lt;BR&gt;&amp;nbsp;&amp;nbsp;PerfLog.AddCounter "\System\*"&lt;BR&gt;&amp;nbsp;&amp;nbsp;PerfLog.Start&lt;BR&gt;&amp;nbsp;End If&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;' We want notification when our counter exeeds 10,000 miliseconds for any longer than 1 second&lt;BR&gt;&amp;nbsp;Set NewTrigger = Controller.PerfWatcher.CreatePerfTrigger("\ASP.NET\Request Execution Time", True, 80000, 1)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;' Store the PerfTrigger ID&lt;BR&gt;&amp;nbsp;ServiceState("PERFTRIGGER_ASPNETEXECUTIONTIME_ID") = NewTrigger.PerfTriggerID&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;' How many times do we want to act on the perf trigger?&lt;BR&gt;&amp;nbsp;ServiceState("PERFTRIGGER_ACTIONLIMIT_" &amp;amp; NewTrigger.PerfTriggerID) = 1&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;' Reset the action counter&amp;nbsp;&lt;BR&gt;&amp;nbsp;ServiceState("PERFTRIGGER_ACTIONCOUNT_" &amp;amp; NewTrigger.PerfTriggerID) = 0&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;' Write out new PerfTrigger info&lt;BR&gt;&amp;nbsp;WriteToLog "NewTrigger Has Been Created:" &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"--------------------------" &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"PerfTriggerID = " &amp;amp; NewTrigger.PerfTriggerID &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"CounterPath = " &amp;amp; NewTrigger.CounterPath &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"TriggerIfAbove = " &amp;amp; NewTrigger.TriggerIfAbove &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Limit = " &amp;amp; NewTrigger.Limit &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"LastValue = " &amp;amp; NewTrigger.LastValue &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"SecondsOutsideLimit = " &amp;amp; NewTrigger.SecondsOutsideLimit&amp;nbsp;&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnPerfTriggerHit(ActiveTrigger)&lt;BR&gt;&amp;nbsp;Dim nActionLimit, nActionCount&lt;BR&gt;&amp;nbsp;Dim DumpName, ActiveProcess&lt;/P&gt;
&lt;P&gt;&amp;nbsp;WriteToLog "OnPerfTriggerHit fired for counter: " &amp;amp; ActiveTrigger.CounterPath&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Select Case ActiveTrigger.PerfTriggerID&lt;BR&gt;&amp;nbsp;Case ServiceState("PERFTRIGGER_ASPNETEXECUTIONTIME_ID")&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;' Do whatever you want here, i.e. create a dump file&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog "Taking action on the following PerfTrigger:" &amp;amp; vbCRLF &amp;amp; _&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"--------------------------" &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"PerfTriggerID = " &amp;amp; ActiveTrigger.PerfTriggerID &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"CounterPath = " &amp;amp; ActiveTrigger.CounterPath &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"TriggerIfAbove = " &amp;amp; ActiveTrigger.TriggerIfAbove &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Limit = " &amp;amp; ActiveTrigger.Limit &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"LastValue = " &amp;amp; ActiveTrigger.LastValue &amp;amp; vbCRLF &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"SecondsOutsideLimit = " &amp;amp; ActiveTrigger.SecondsOutsideLimit&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;For Each ActiveProcess In Controller.Processes&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If UCase(ActiveProcess.ProcessName) = "W3WP.EXE" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpName = ActiveProcess.CreateDump("PerfTrigger Fired")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog "Created dump file " &amp;amp; DumpName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exit For&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;Next&lt;BR&gt;&amp;nbsp;End Select&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;' Keep track of the action count&amp;nbsp;&lt;BR&gt;&amp;nbsp;nActionCount = ServiceState("PERFTRIGGER_ACTIONCOUNT_" &amp;amp; ActiveTrigger.PerfTriggerID)&lt;BR&gt;&amp;nbsp;nActionCount = nActionCount + 1&amp;nbsp;&lt;BR&gt;&amp;nbsp;ServiceState("PERFTRIGGER_ACTIONCOUNT_" &amp;amp; ActiveTrigger.PerfTriggerID) = nActionCount&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;' Remove this trigger if we've exceeded our action limit&lt;BR&gt;&amp;nbsp;nActionLimit = ServiceState("PERFTRIGGER_ACTIONLIMIT_" &amp;amp; ActiveTrigger.PerfTriggerID)&amp;nbsp;&lt;BR&gt;&amp;nbsp;If nActionCount &amp;gt;= nActionLimit Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog "Action limit of " &amp;amp; nActionLimit &amp;amp; " was reached.&amp;nbsp; (nActionCount = " &amp;amp; nActionCount &amp;amp; ")&amp;nbsp; Removing PerfTrigger."&lt;BR&gt;&amp;nbsp;&amp;nbsp;Controller.PerfWatcher.RemovePerfTrigger ActiveTrigger.PerfTriggerID&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnShutdown()&lt;BR&gt;&amp;nbsp;WriteToLog "DbgSVC stopped"&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnProcessExited(ByVal ExitingProcess)&lt;BR&gt;&amp;nbsp;Dim Message&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Message = FormatString("Process Exited:",25) &amp;amp; " Process Name - " &amp;amp; FormatString(ExitingProcess.ProcessName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;" Process ID - " &amp;amp; FormatString(ExitingProcess.ProcessID, 6) &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If ExitingProcess.COMPlusPackageName &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;Message = Message &amp;amp; " MTS/COM+ package name - " &amp;amp; ExitingProcess.COMPlusPackageName&lt;BR&gt;&amp;nbsp;ElseIf ExitingProcess.WebAppPoolName &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;Message = Message &amp;amp; " Web application pool name - " &amp;amp; ExitingProcess.WebAppPoolName&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;WriteToLog Message&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub HandleProcess(ByVal Process, ByVal ControlScript)&lt;BR&gt;&amp;nbsp;If Process.IsDebuggerAttached Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Reload Control Script:",25) &amp;amp; " Process Name - " &amp;amp; FormatString(Process.ProcessName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;" Process ID - " &amp;amp; FormatString(Process.ProcessID, 6) &amp;amp; " Control Script - " &amp;amp; ControlScript&lt;BR&gt;&amp;nbsp;&amp;nbsp;Process.ReloadControlScript ControlScript&lt;BR&gt;&amp;nbsp;ElseIf Not Process.IsBeingDebugged Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Attach Debugger:",25) &amp;amp; " Process Name - " &amp;amp; FormatString(Process.ProcessName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;" Process ID - " &amp;amp; FormatString(Process.ProcessID, 6) &amp;amp; " Control Script - " &amp;amp; ControlScript&lt;BR&gt;&amp;nbsp;&amp;nbsp;Process.AttachToProcess ControlScript, SymbolPath, ""&lt;BR&gt;&amp;nbsp;Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Unknown Debugger:",25) &amp;amp; " Process Name - " &amp;amp; FormatString(Process.ProcessName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;" Process ID - " &amp;amp; FormatString(Process.ProcessID, 6)&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub HandleService(ByVal Service)&lt;BR&gt;&amp;nbsp;If Service.ProcessID &amp;lt;&amp;gt; 0 and Service.CurrentState = "SERVICE_RUNNING" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;ControlScript = GetControlScriptForService(Service)&lt;BR&gt;&amp;nbsp;&amp;nbsp;If ControlScript &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set Process = ProcessManager.GetProcessByProcessID(Service.ProcessID)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If Not Process Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HandleProcess Process, ControlScript&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnNewServiceFound(ByVal NewService)&lt;BR&gt;&amp;nbsp;WriteToLog FormatString("New service found:",25) &amp;amp; " Service Name - " &amp;amp; FormatString(NewService.ServiceName, 20) &amp;amp; _&lt;BR&gt;&amp;nbsp;" Process ID - " &amp;amp; FormatString(NewService.ProcessID, 6) &amp;amp; " Current State - " &amp;amp; NewService.CurrentState&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;HandleService NewService&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnServiceStateChanged(ByVal AffectedService)&lt;BR&gt;&amp;nbsp;WriteToLog FormatString("Service state changed:",25) &amp;amp; " Service Name - " &amp;amp; FormatString(AffectedService.ServiceName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;" Process ID - " &amp;amp; FormatString(AffectedService.ProcessID, 6) &amp;amp; " Current State - " &amp;amp; AffectedService.CurrentState&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;HandleService AffectedService&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnNewProcessFound(ByVal NewProcess)&lt;BR&gt;&amp;nbsp;Dim Message&lt;BR&gt;&amp;nbsp;Dim GFlags&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Message = FormatString("New process found:",25) &amp;amp; " Process Name - " &amp;amp; FormatString(NewProcess.ProcessName,20) &amp;amp; _&lt;BR&gt;&amp;nbsp;" Process ID - " &amp;amp; FormatString(NewProcess.ProcessID, 6) &amp;amp; " Process Identity - " &amp;amp; FormatString(NewProcess.ProcessIdentity, 40)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;GFlags = Controller.GetGlobalFlagForProcess(NewProcess.ProcessName)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If GFlags &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;Message = Message &amp;amp; " Global Flags - " &amp;amp; FormatString(GFlags, 12)&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If NewProcess.COMPlusPackageName &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;Message = Message &amp;amp; " MTS/COM+ package name - " &amp;amp; NewProcess.COMPlusPackageName&lt;BR&gt;&amp;nbsp;ElseIf NewProcess.WebAppPoolName &amp;lt;&amp;gt; "" Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;Message = Message &amp;amp; " Web application pool name - " &amp;amp; NewProcess.WebAppPoolName&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;WriteToLog Message&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;ControlScript = GetControlScriptForProcess(NewProcess)&lt;BR&gt;&amp;nbsp;If ControlScript &amp;lt;&amp;gt; "" Then HandleProcess NewProcess, ControlScript&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub StartLeakRule(ByVal ProcessID)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;Set Process = ProcessManager.GetProcessByProcessID(ProcessID)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If Process Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Start Leak Rule Failed:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatString(ProcessID, 6) &amp;amp; " Process Not Found"&lt;BR&gt;&amp;nbsp;Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;Process.InjectLeakTrack&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Leak Rule Started:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatString(ProcessID, 6)&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Sub&lt;BR&gt;Sub StopLeakRule(ByVal ProcessID, ByVal RuleFolder, ByVal bUnloadLeakTrack)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;Set Process = ProcessManager.GetProcessByProcessID(ProcessID)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;If Process Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Stop Leak Rule Failed:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatString(ProcessID, 6) &amp;amp; " Process Not Found"&lt;BR&gt;&amp;nbsp;Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;DumpPath = Process.CreateDump("Leak Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;FormatString(ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If bUnloadLeakTrack Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Process.UnloadLeakTrack&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Leak Rule Stopped:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatString(ProcessID, 6)&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;End If&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpAllIISProcesses(ByVal RuleFolder)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;For each Process in ProcessManager&lt;BR&gt;&amp;nbsp;&amp;nbsp;ProcessName = UCase(Process.ProcessName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;Select Case ProcessName&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "INETINFO.EXE", "MTX.EXE", "DLLHOST.EXE", "DLLHST3G.EXE", "W3WP.EXE", "ASPNET_WP.EXE"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpPath = Process.CreateDump("IIS Hang Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatString(Process.ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;End Select&lt;BR&gt;&amp;nbsp;Next&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpProcess(ByVal RuleFolder, ByVal TargetName)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;For each Process in ProcessManager&lt;BR&gt;&amp;nbsp;&amp;nbsp;ProcessName = UCase(Process.ProcessName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If ProcessName = UCase(TargetName) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpPath = Process.CreateDump("IIS Hang Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatString(Process.ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;Next&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpCOMPlusApp(ByVal RuleFolder, ByVal TargetName)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;For each Process in ProcessManager&lt;BR&gt;&amp;nbsp;&amp;nbsp;PackageName = UCase(Process.COMPlusPackageName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If PackageName = UCase(TargetName) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpPath = Process.CreateDump("IIS Hang Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatString(Process.ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;Next&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpWebAppPool(ByVal RuleFolder, ByVal TargetName)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;For each Process in ProcessManager&lt;BR&gt;&amp;nbsp;&amp;nbsp;AppPoolName = UCase(Process.WebAppPoolName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If AppPoolName = UCase(TargetName) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpPath = Process.CreateDump("IIS Hang Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatString(Process.ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;Next&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpProcessID(ByVal RuleFolder, ByVal TargetPID)&lt;BR&gt;&amp;nbsp;Set ProcessManager = Controller.Processes&lt;BR&gt;&amp;nbsp;Set Process = ProcessManager.GetProcessByProcessID(TargetID)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;DumpPath = Process.CreateDump("IIS Hang Dump", RuleFolder)&lt;BR&gt;&amp;nbsp;WriteToLog FormatString("Process Dump Created:",25) &amp;amp; " Process ID - " &amp;amp; _&lt;BR&gt;&amp;nbsp;FormatString(Process.ProcessID, 6) &amp;amp; " Dump Path - " &amp;amp; DumpPath&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub DumpNTService(ByVal RuleFolder, ByVal TargetName)&lt;BR&gt;&amp;nbsp;Set ServiceManager = Controller.Processes&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;For each NTService in ServiceManager&lt;BR&gt;&amp;nbsp;&amp;nbsp;ServiceName = UCase(NTService.ServiceName)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;If ServiceName = UCase(TargetName) And NTService.ProcessID &amp;lt;&amp;gt; 0 Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DumpProcessID RuleFolder, NTService.ProcessID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exit For&lt;BR&gt;&amp;nbsp;&amp;nbsp;End If&lt;BR&gt;&amp;nbsp;Next&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnHTTPPingError(ByVal FailedURL)&lt;BR&gt;&amp;nbsp;WriteToLog FormatString("HTTP Ping Error:",25) &amp;amp; " Ping URL - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FailedURL.URL &amp;amp; " Status Code - " &amp;amp; FailedURL.LastStatusCode &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;" Status Text - " &amp;amp; FailedURL.LastStatusText&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub Controller_OnHTTPPingTimeout(ByVal TimedOutURL)&lt;BR&gt;&amp;nbsp;WriteToLog FormatString("HTTP Ping Timeout:",25) &amp;amp; " Ping URL - " &amp;amp; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;TimedOutURL.URL &amp;amp; " Timeout(secs) - " &amp;amp; TimedOutURL.TimeoutInterval&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;HandleIISHangRule TimedOutURL&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Function GetControlScriptForService(ByVal Service)&lt;BR&gt;&amp;nbsp;GetControlScriptForService = ""&lt;BR&gt;&amp;nbsp;ServiceName = UCase(Service.ServiceName)&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Function GetControlScriptForProcess(ByVal Process)&lt;BR&gt;&amp;nbsp;GetControlScriptForProcess = ""&lt;BR&gt;End Function&lt;/P&gt;
&lt;P&gt;Sub CreatePingURLs()&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;Sub HandleIISHangRule(ByVal TimedOutURL)&lt;BR&gt;End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=629624" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/debugdiag/attachment/629624.ashx" length="7277" type="application/x-zip-compressed" /></item><item><title>Sample: How to create scripts for DebugDiag tool</title><link>http://blogs.msdn.com/debugdiag/archive/2006/03/28/563113.aspx</link><pubDate>Tue, 28 Mar 2006 18:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:563113</guid><dc:creator>debugdiag</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/debugdiag/comments/563113.aspx</comments><wfw:commentRss>http://blogs.msdn.com/debugdiag/commentrss.aspx?PostID=563113</wfw:commentRss><description>&lt;SPAN id=SampleInfoControl_LabelDescription&gt;This material shows how to create scripts for DebugDiag tool, using public extensions, in order to analyze dumps considering the particularities of some specific application or even to have a different kind of report from those that come with DebugDiag. One of the sample scripts uses SOS extension to report memory issues that could happen with CLR/GC on .NET Applications. Pre-req is to have a basic WinDbg knowledge.&lt;/SPAN&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=563113" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/debugdiag/attachment/563113.ashx" length="2629588" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/debugdiag/archive/tags/DebugDiag+Training/default.aspx">DebugDiag Training</category></item></channel></rss>