ADPlus

Für Exchange Administratoren und "nicht Entwickler" ist das Wort "Debugger" schon abschreckend genug. Aber es wird ja gar nicht erwartet, dass Sie im nicht vorhandenen Source Code nach Fehler suchen. Aber wenn Microsoft oder ein anderes Supportunternehmen Sie um einen "Dump" mit ADPlus bittet, dann sollten Sie nicht vor Schreck erstarren. Man erwartet einfach nur, dass Sie uns helfen, Daten für eine weitere Fehlersuche zu sammeln. Es ist sicher nicht angenehm, wenn ein Prozess sich ungeplant verabschiedet. Aber peinlich ist es, wenn dies immer wieder passiert und der Entwickler mangels Datenmaterial gar nichts analysieren kann.

Er kann ja nicht auf ihrem Live-System mit einer EntwicklungsUmgebung den Code schrittweise durchlaufen. Er kann aber einen "Dump" nutzen, um damit bei sich die Fehlersituation nachzustellen und so den Fehler finden. ADPlus ist ein VBScript, welches die Windows Debuggingfunktionen z.B.: so steuert, dass z.B. beim Crash eines Prozesses dessen LaufzeitUmgebung vom Betriebssystem in Dateien abgespeichert werden. Eine zweite Funktion erfüllt ADPlus bei der Suche nach Gründen, warum ein Prozess z B auf 100% Last verbleibt.

Voraussetzung für den Einsatz von ADPlus ist aber immer, dass der Prozess auch wirklich startet.

ADPlus vorbereiten

Ehe Sie ADPlus einsetzen können, müssen Sie auf dem Server natürlich die Windows Debugging Tools in der richtigen Version installieren. Diese erhalten Sie auf http://www.microsoft.com/whdc/devtools/debugging/default.mspx zum Download.

Install Debugging Tools für Windows (je ca. 16 MB)
64bit: http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx 
32bit: http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

Installieren Sie diese Tools auf dem betroffenen Server. Sie können die Dateien auch direkt auf das Zielsystem kopieren. Hier mal ein Auszug meiner Debugging Tools meines Vista Clients.

ADPlus ausführen

ADPlus ist nur ein "VBScript", welcher idealerweise mit CSCRIPT gestartet wird. Zwei Aufrufe sind am häufigsten genutzt:

REM Warten auf den Absturz des Edge-Transports
cscript adplus.vbs -crash -pn edgetransport.exe

REM "Kopie" des LSASS ziehen
cscript adplus.vbs -hang -pn lasss.exe

Für die Entwickler von Webseiten ist ADPlus ebenfalls hilfreich, weil damit auch Fehler auf Webseiten bzw. bei der Verarbeitung dieser analysiert werden können. Interessant wird dies natürlich, wenn man den Aufruf von ADPLUS mit Triggern verbindet, z.B. wenn ein bestimmtes Ereignis auftritt. Wer mag, kann ADPLUS beim Auftreten eines Fehlers, diesen auch per Instant Messaging melden.

Dump Auswerten

Das Auswerten eines Dump ist in Grenzen auch ohne den Quellcode möglich, aber effektiv ist dies erst, wenn der Entwickler der betroffenen Software natürlich den passenden Quellcode zur Verfügung hat, so dass die binären Werte auch zu sprechenden Variablen und Funktionen zugeordnet werden können.

In der Regel wird Microsoft dann von ihnen fordern, den Dump entsprechende komprimiert auf einen Server hochzuladen, damit dort die Fehler dann weiter untersucht werden können.

ADPlus "antriggern"

Bei einem anderen Supportfall gab es die Notwendigkeit, ADPLUS im "hang"-Mode zu starten, wenn eine bestimmte Fehlermeldung in einem Logfile erscheint. Folgendes einfaches Skript löst dies mit PowerShell und "Get-Content".

# Get-Content ist leider kein echter TAIL sondern liest auch erst die komplette Datei
# sind dort schon "Treffer" drin, wird auch hier schon ein Dump erzeugt.

Get-Content -Path "c:\Program Files (x86)\Microsoft Forefront Security\Exchange Server\Data\ProgramLog.txt" -Wait | foreach {
	if ($_.contains("Failed to allocate memory")) {
		Write-warning "Found"
		cscript.exe "c:\Program Files\Debugging Tools für Windows (x86)\adplus.vbs" -hang -pn fscrealtimescanner.exe -quiet -o c:\temp\dump
		Start-Sleep 2   # it might need a short time für CDB to attach and initialize
		do {
			Write-Host "Wait für all CDB-Processes"
		} while ((Get-Process -Name fscrealtimescanner) -ne $null )
		Write-warning "done"
	}
	else {
		Write-Host "Skip:" $_
	}
}

Leider kennt "Get-Content" keine Option am Ende einer Datei aufzusetzen, sondern liest immer vom Anfang an durch, was bei großen Dateien langer dauern kann aber vor allem bereits vorhandene alte Vorkommen "findet". Wichtig ist daher vorher das leeren der Logs, damit wirklich nur neue Events dann zum tragen kommen. 

Weitere Links