wildlife

Leaklogger

Download:

  Leaklogger 1.0 (3.3 MiB, 1,145 hits)

1 Einführung

1.1 Memory Leak

Speicherleck (englisch memory leak, gelegentlich auch Speicherloch oder kurz memleak) werden Fehler in einem Computerprogramm genannt, die es ermöglichen, dass ein laufender Prozess einen Speicherbereich belegt, diesen jedoch im Zuge der Ausführung weder freigeben noch nutzen kann.[1]

Läuft nun z.B. der Nonpaged Pool voll, muss dies das System nicht zwangsläufig mit einem Bluescreen quittieren. Es kann jedoch von keiner anderen Anwendung Nonpaged Pool in Anspruch genommen werden, welches sich in verschiedenen Variationen äußern kann. Wie auf dem Screenshot zu sehen, belegt der Nonpaged Pool 130.956 KB bei einem Limit von 131.072 KB. Ein Versuch Paint zu öffnen resultierte in folgender Fehlermeldung:

image

1.2 Nonpaged Pool

Der Betriebssystemkernel und Gerätetreiber nutzen den nonpaged pool um Daten zu speichern, auf die auch dann noch zugegriffen kann, wenn das System Pagefaults nicht händeln kann. Wenn letzteres auftritt, ist meist ein fehlerhafter Treiber Schuld, welcher in diesem Zusammenhang auch gleich meist den IRQL_NOT_LESS_OR_EQUAL Bluescreen verursacht.

Der Nonpaged Pool ist daher ständig im physikalischen Speicher hinterlegt und wird im Gegensatz zum Paged Pool nicht ausgelagert.


1.3 Paged Pool

Im Gegensatz zum Nonpaged Pool kann der Paged Pool ausgelagert werden. Daher auch der Name pagefile.sys für die entsprechende Datei. Wenn ein Treiber oder ein Prozess Speicher des Paged Pool referenziert, dieser sich jedoch bereits im ausgelagerten Speicher (pagefile.sys) befindet, spricht man von einem Page Fault (dt. Seitenfehler). Tritt dies auf, wird der ausgelagerte (virtuelle) Speicher wieder in den physikalischen Speicher gelesen.

Treiber verwenden einen 4-byte großen ‚Tag‘, mit welchem sie eindeutig identifiziert werden können. Dieses Tag wird z.B. in Poolmon oder im Leaklogger zur Erkennung eines Memoryleak verursachenden Treibers verwendet.

1.4 Nonpaged Pool Limit

Auf einem 32-bit Windows ist der Systemadressspeicher auf 2GB limitiert. Dies schränkt somit auch das Limit des Nonpaged Pools auf diese Größe ein, wobei noch Speicher für andere Ressourcen wie den Kernel, Gerätetreiber, etc. benötigt werden. Bis Vista bestimmt das System bei jedem Boot, wie groß der Adressbereich für jede Ressource benötigt wird. Das Minimum für das Nonpaged Pool Limit auf einem System mit 512 MB RAM liegt bei 128 MB. Bei einem System mit 1 GB RAM oder mehr liegt das Limit bei 256 MB.

Ab Windows Vista wird die Größe der Adressbereiche dynamisch den Ressourcen zugeteilt. Das Maximum für den Nonpaged Pool ist hier entweder 75% oder 2 GB, je nachdem, was kleiner ist. Bei 64-bit Betriebssystemen (ab Vista) liegt das Limit bei ca. 400 KB pro MB Arbeitsspeicher oder 128 GB, je nachdem, was geringer ist.

1.5 Paged Pool Limit

Der Pagedpool wird für sämtliche Daten des Kernels oder der Gerätetreiber verwendet, welche nicht durch die Bedingungen für den Nonpaged Pool abgedeckt werden.

Auf einem 32-bit Windows XP wird das Limit des Paged Pools durch die Größe der Adressräume anderer Ressourcen bestimmt. Da bei 32-bit Betriebssystemen ab Vista der Kernel Adressraum dynamisch bestimmt wird, liegt das Limit hier bei 2 GB. Bei Windows XP oder Server 2003 auf 64-bit Basis, ist das Limit des Paged Pools vier Mal so groß, wie das Limit des Nonpaged Pools oder 128 GB, je nachdem, was geringer ist. Bei allen 64-bit Betriebssystemen ab Vista liegt das Limit des Paged Pools bei 128 GB.

2 Benutzung des Leakloggers

2.1 Mit Benutzereingabe

Um mit dem Process Explorer die Limits des Paged und Nonpaged Pools sehen zu können, benötigen wird die Debugging Tools für Windows in der jeweiligen Version für die Architektur des Betriebssystems (x86 oder x64).

Hier enthalten ist die Datei dbghelp.dll, welche nach dem Start des Leakloggers angegeben werden muss. Die in C:\Windows\System32 liegende dbghelp.dll ist hierfür genauso wenig ausreichend, wie die Datei selbst auf ein anderes System zu kopieren. Eine Installation der Tools ist für die Sammlung sämtlicher benötigter Informationen unverzichtbar:

image

Als nächstes muss das Verzeichnis angegeben werden, in welchem später die gepackten Ergebnisse hinterlegt werden. Hier bietet sich entweder der Desktop für einen schnellen Zugriff oder eines der Temp-Verzeichnisse für eine mittelfristige Archivierung an:

image

Während der Laufzeit des Leakloggers werden mehrere Splashscreens angezeigt, die über den aktuellen Schritt informieren:

  1. Extrahieren der, für das Erstellen des Logs, benötigten Dateien:
    image
  2. Abfragen von Werten aus dem Process Explorer. Während diesem Schritt erscheint sowohl der Process Explorer selbst als auch das Systeminformation Fenster, welches ein Bestandteil des PE ist:
    image
  3. Abfragen der Poolmon Werte:
    image
  4. Auswertung der gesammelten Informationen:
    image
  5. Generierung des Outputs und packen der Ergebnisse / Logs:
    image
  6. Löschen der temporär benötigten Dateien:
    image
  7. Benachrichtigung über die Beendigung des Leakloggers:

    image

2.2 Ohne Benutzereingaben / Silent

Um den Leaklogger silent (ohne Benachrichtigungen / Informationen mittels Fenster) auszuführen, gibt es diverse Parameter die optional sind. Ausnahme hierbei ist der Schalter /s, welcher die Verwendung der Parameter /dbg und /dest voraussetzt:

/dbg
mittels /dbg=<Pfad zu dbghelp.dll> kann die dbghelp.dll direkt und ohne GUI angegeben werden. Die dbghelp.dll ist Bestandteil der Windows Debugging Tools (http://www.microsoft.com/whdc/devtools/debugging/default.mspx) und werden für die Anzeige des PagedPool und NonpagedPool Limits im Sysinternals Process Explorer (http://technet.microsoft.com/de-de/sysinternals/bb896653.aspx) benötigt.
Bei Pfaden mit Leerzeichen, muss dieser in Anführungszeichen gesetzt werden.
Beispiel:
leaklogger.exe /dbg=“C:\Program Files\Debugging Tools for Windows (x64)\dbghelp.dll“

/dest
mittels /dest=<Speicherpfad für Ergebnisse> kann ein Verzeichnis angegeben werden, in welchem die Ergebnisse des Leakloggers gespeichert werden.
Bei Pfaden mit Leerzeichen, muss dieser in Anführungszeichen gesetzt werden.
Beispiel:
leaklogger.exe /dest=“ C:\Users\Torsten\Desktop“

/s
mittels /s=true wird das Tool Leaklogger silent, d.h. ohne Benachrichtungsfenster, etc. ausgeführt. Ist dieser Schalter aktiv, müssen auch die Parameter /dbg und /dest verwendet werden, da sonst die Informationen zum Speicherpfad der Ergebnisse und die Informationen zur dbghelp.dll nicht vorhanden sind. Das Öffnen des Process Explorer lässt sich hierdurch jedoch nicht vermeiden.
Beispiel:
leaklogger.exe /dbg=“C:\Program Files\Debugging Tools for Windows (x64)\dbghelp.dll“ /dest=“ C:\Users\Torsten\Desktop“ /s=true


2.3 Automatische Ausführung über die geplanten Tasks

Durch die Möglichkeit, über die Parameter alle benötigten Informationen mitzugeben, kann der Leaklogger auch über die geplanten Tasks gestartet werden. Dies kann hilfreich sein, um Memory Leaks zu identifizieren, die zwar erst nach längeren Zeitraum das System lahmlegen, die Erstellung eines Logs oder die Identifikation des Tags des verursachenden Treibers bei der Feststellung desselben nicht mehr möglich ist.

Bei einem Volllaufen des Speichers nach z.B. einer Woche, würde es sich empfehlen, den Leaklogger zwei Mal täglich (alle 12 Stunden) silent über den Taskplaner laufen zu lassen. Nach dem Einfrieren oder Absturz des Systems können so die letzten Logs ausgewertet werden. Die Notwendigen Schritte hierzu sind z.B. unter Windows XP:

  1. Starten des Taskplaners:
    image
  2. Wählen des Leaklogges als zu startendes Programm:
    image
  3. Wählen des Namens für den Task und der Startfrequenz:
    image
  4. Wählen der Startzeit. Hier sollte nicht „Werktags“ gewählt werden, da einem Memory Leak egal ist, ob es sich um einen Werktag oder um ein Wochenende handelt:
    image
  5. Eingabe des Accounts, unter welchem der Leaklogger gestartet wird. Da Zugriff auf hardwarenahe Informationen abgefragt werden, empfiehlt es sich, einen Benutzer mit lokalen Administratorrechten zu wählen. Der Benutzer sollte dabei in der Syntax „Domäne\Benutzer“ bzw. „Rechnername\Benutzer“ angegeben werden:
    image
  6. Nach der Fertigstellung des Tasks, muss die Option „Erweiterte Eigenschaften für diesen Task beim Klicken auf ‚Fertig stellen‘ öffnen“ aktiviert werden, um weitere Eigenschaften des Tasks zu konfigurieren:
    image
  7. Im Feld „Ausführen“ müssen nun die Parameter hinter dem letzten Anführungszeichen angegeben werden, um den Leaklogger ohne weitere Benutzereingaben zu starten:
    image
  8. Im Tab „Zeitplan“ kann der Button „Erweitert“ genutzt werden, um im darauffolgenden Fenster den Wiederholungsintervall granular zu bestimmen:
    image
    image

3 Ergebnisse

3.1 General

Hier wird die Anzahl der Handels, Threads und Prozesse zum Zeitpunkt der Ausführung vom Leaklogger angezeigt.

3.2 Memory

Hier werden die Werte für Paged physical, Paged virtual, Paged limit, Nonpaged und Nonpaged Limit angezeigt, welche Aufschluss über die aktuelle Auslastung des Arbeitsspeichers zeigen.

3.3 Tags

In den Spalten Paged memory und Nonpaged memory werden die jeweils drei Ressourcenintensivsten Treiber mit deren Tags, dem Anteil am insgesamt genutzten Speicher in Prozent und jeweils die Werte Binaryname / Treiber, Beschreibung (sofern vorhanden), Allocations, Frees, Diff (Differenz zwischen Allocations und Frees), Bytes (beanspruchte Größe des Speichers) und Per alloc (Größe jeder Allocation in Bytes).

3.4 Beispiele

Hier zwei Beispiele einer Ausgabe, bei welcher ein Memory Leak mittels NotMyfault (http://technet.microsoft.com/en-us/sysinternals/bb963901.aspx) im Paged Pool erzeugt wurde. Wie an dem Wert von „Per alloc“ zu sehen ist, wurden pro Allocation ca. 300 KB in den Paged Pool geschrieben und 104 Allocations durchgeführt
imageimage


4 Troubleshooting

4.1 Debuglog

Das Debuglog (leakloggerdbg.log) wird automatisch erstellt, während Leaklogger ausgeführt wird. Das Log befindet sich im Usertemp-Verzeichnis, welches im Windowsexplorer oder über Start > Ausführen mit %temp% geöffnet werden kann.

4.2 Errorcodes

11 - IA64 Architektur nicht unterstützt
12 – Fehler in Funktion _FileListToArray
13 - Windows Debugging Tools sind nicht installiert
14 - User ist kein Administrator
15 – Diaglog zum Öffnen von dbghlp.dll wurde geschlossen
16 - Diaglog zum Öffnen von dbghlp.dll wurde geschlossen
17 – Falsche Angabe der Parameter
18 – Silent-Mode wurde gewählt, jedoch keine dbghlp.dll angegeben
19 - Silent-Mode wurde gewählt, jedoch keine Verzeichnis für die Speicherung der Ausgabe angegeben
20 – Dateien konnten nicht extrahiert werden
21 – Konfiguration für den Process Explorer konnte nicht geschrieben werden
22 – Process Explorer Werte konnten nicht geschrieben werden
23 – Erstellung der Poolmon-Logs fehlgeschlagen

41 – Temporäres Verzeichnis konnte nicht erstellt werden
42 – Globalflag konnte nicht gesetzt werden

71 – User hat das Setzen des Globalflags abgebrochen
72 – User hat Abfrage für Reboot abgebrochen

99 – Leaklogger wurde aufgrund des benötigten Reboots beendet


[1] Wikipedia – Speicherleck - http://de.wikipedia.org/wiki/Speicherleck