Freigeben über


Debuggen von verwaltetem Code mithilfe des Windows-Debuggers

Sie können die Windows-Debugger (WinDbg, CDB und NTSD) verwenden, um Zielanwendungen zu debuggen, die verwalteten Code enthalten. Zum Debuggen von verwaltetem Code müssen Sie die SOS-Debugerweiterung (sos.dll) und eine Datenzugriffskomponente (mscordacwks.dll) laden.

Die Windows-Debugger sind vom Visual Studio-Debugger getrennt. Informationen zur Unterscheidung zwischen den Windows-Debuggern und dem Visual Studio-Debugger finden Sie unter Windows-Debuggen.

Einführung in verwalteten Code

Verwalteter Code wird zusammen mit der Microsoft .NET Common Language Runtime (CLR) ausgeführt. In einer Anwendung mit verwaltetem Code befindet sich der binärcode, den der Compiler erzeugt, in Microsoft Intermediate Language (MSIL), die plattformunabhängig ist.

Wenn verwalteter Code ausgeführt wird, erzeugt die Runtime systemeigenen Code, der plattformspezifisch ist. Der Prozess der Generierung von nativem Code aus MSIL wird als JIT-Kompilierung (Just-in-Time)-Kompilierung bezeichnet. Nachdem der JIT-Compiler die MSIL für eine bestimmte Methode kompiliert hat, verbleibt der native Code der Methode im Arbeitsspeicher. Wenn diese Methode später aufgerufen wird, wird der native Code ausgeführt, und der JIT-Compiler muss nicht beteiligt sein.

Sie können verwalteten Code mithilfe mehrerer Compiler erstellen, die von einer Vielzahl von Softwareherstellern hergestellt werden. Microsoft Visual Studio kann insbesondere verwalteten Code aus verschiedenen Sprachen erstellen, einschließlich C#, Visual Basic, JScript und C++ mit verwalteten Erweiterungen.

Die CLR wird nicht jedes Mal aktualisiert, wenn die .NET Framework aktualisiert wird. Beispielsweise verwenden alle Versionen 2.0, 3.0 und 3.5 der .NET Framework version 2.0 der CLR. Die folgende Tabelle zeigt die Version und den Dateinamen der CLR, die von jeder Version der .NET Framework verwendet wird.

.NET Framework-Version CLR-Version CLR-Dateiname
1.1 1.1 mscorwks.dll
2.0 2.0 mscorwks.dll
3.0 2.0 mscorwks.dll
3,5 2.0 mscorwks.dll
4,0 4,0 clr.dll
4.5 4,0 clr.dll

Debuggen von verwaltetem Code

Zum Debuggen von verwaltetem Code muss der Debugger diese beiden Komponenten laden.

Hinweis Für alle Versionen der .NET Framework wird der Dateiname der DAC mscordacwks.dll, und der Dateiname der SOS-Debugerweiterung ist sos.dll.

Abrufen der SOS-Debugerweiterung (sos.dll)

Die SOS-Debugerweiterungsdateien (sos.dll) sind in der aktuellen Version der Debugtools für Windows nicht enthalten.

Für .NET Framework Versionen 2.0 und höher ist sos.dll in der .NET Framework-Installation enthalten.

Für Version 1. x der .NET Framework, sos.dll nicht in der .NET Framework-Installation enthalten ist. So erhalten Sie sos.dll für .NET Framework 1.x, laden Sie die 32-Bit-Version von Windows 7 Debugging Tools für Windows herunter.

Windows 7-Debugtools für Windows sind im Windows SDK für Windows 7 enthalten, das an diesen beiden Stellen verfügbar ist:

Wenn Sie eine x64-Version von Windows ausführen, verwenden Sie die ISO, damit Sie angeben können, dass Sie die 32-Bit-Version des SDK verwenden möchten. Sos.dll ist nur in der 32-Bit-Version von Windows 7 Debugging Tools für Windows enthalten.

Laden von mscordacwks.dll und sos.dll (Livedebugging)

Angenommen, der Debugger und die zu debuggende Anwendung werden auf demselben Computer ausgeführt. Anschließend wird der von der Anwendung verwendete .NET Framework auf dem Computer installiert und steht dem Debugger zur Verfügung.

Der Debugger muss eine Version der DAC laden, die mit der CLR-Version identisch ist, die von der Anwendung mit verwaltetem Code verwendet wird. Die Bitanzahl (32-Bit oder 64-Bit) muss ebenfalls übereinstimmen. Der DAC (mscordacwks.dll) wird mit dem .NET Framework. Um die richtige Version der DAC zu laden, fügen Sie den Debugger an die Anwendung mit verwaltetem Code an, und geben Sie diesen Befehl ein.

.cordll -ve -u -l

Die Ausgabe sollte ähnlich sein.

CLRDLL: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll
CLR DLL status: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll

Um zu überprüfen, ob die Version von mscordacwks.dll mit der Version der CLR übereinstimmt, die die Anwendung verwendet, geben Sie einen der folgenden Befehle ein, um Informationen zum geladenen CLR-Modul anzuzeigen.

lmv mclr (für Version 4.0 der CLR)

lmv mscorwks (für Version 1.0 oder 2.0 der CLR)

Die Ausgabe sollte ähnlich sein.

start             end                 module name
000007ff`26710000 000007ff`2706e000   clr        (deferred)             
    Image path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
...

Beachten Sie im vorherigen Beispiel, dass die Version der CLR (clr.dll) mit der Version der DAC (mscordacwks.dll) übereinstimmt: v4.0.30319. Beachten Sie auch, dass beide Komponenten 64-Bit sind.

Wenn Sie cordll zum Laden der DAC verwenden, wird die SOS-Debugerweiterung (sos.dll) möglicherweise automatisch geladen. Wenn sos.dll nicht automatisch geladen wird, können Sie einen dieser Befehle zum Laden verwenden.

.loadby sos clr (für Version 4.0 der CLR)

.loadby sos mscorwks (für Version 1.0 oder 2.0 der CLR)

Alternativ zur Verwendung von .loadby können Sie .load verwenden. Wenn Sie beispielsweise Version 4.0 der 64-Bit-CLR laden möchten, können Sie einen Befehl wie diesen eingeben.

LOAD-C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll

Beachten Sie in der vorherigen Ausgabe, dass die Version der SOS-Debugerweiterung (sos.dll) mit der Version der CLR und der DAC übereinstimmt: v4.0.30319. Beachten Sie auch, dass alle drei Komponenten 64-Bit sind.

Laden von mscordacwks.dll und sos.dll (Dumpdatei)

Angenommen, Sie verwenden den Debugger, um eine Dumpdatei (einer Anwendung mit verwaltetem Code) zu öffnen, die auf einem anderen Computer erstellt wurde.

Der Debugger muss eine Version der DAC laden, die mit der Version der CLR übereinstimmt, die die Anwendung mit verwaltetem Code auf dem anderen Computer verwendet hat. Die Bitanzahl (32-Bit oder 64-Bit) muss ebenfalls übereinstimmen.

Die DAC (mscordacwks.dll) wird mit dem .NET Framework, aber angenommen, Sie haben nicht die richtige Version des .NET Framework auf dem Computer installiert, auf dem der Debugger ausgeführt wird. Sie haben drei Optionen.

  • Laden Sie die DAC von einem Symbolserver. Beispielsweise können Sie den öffentlichen Symbolserver von Microsoft in Ihren Symbolpfad einschließen.
  • Installieren Sie die richtige Version des .NET Framework auf dem Computer, auf dem der Debugger ausgeführt wird.
  • Rufen Sie die richtige Version von mscordacwks.dll von der Person ab, die die Dumpdatei (auf einem anderen Computer) erstellt hat, und kopieren Sie sie manuell auf den Computer, auf dem der Debugger ausgeführt wird.

Hier veranschaulichen wir die Verwendung des öffentlichen Symbolservers von Microsoft.

Geben Sie diese Befehle ein.

.sympath+ srv\* (Symbolserver zum Symbolpfad hinzufügen.)

!sym laut

.cordll -ve -u -l

Die Ausgabe ähnelt dieser.

CLRDLL: Unable to get version info for 'C:\Windows\Microsoft.NET
   \Framework64\v4.0.30319\mscordacwks.dll', Win32 error 0n87

SYMSRV:  C:\ProgramData\dbg\sym\mscordacwks_AMD64_AMD64_4.0.30319.18010.dll
   \5038768C95e000\mscordacwks_AMD64_AMD64_4.0.30319.18010.dll not found

SYMSRV:  mscordacwks_AMD64_AMD64_4.0.30319.18010.dll from 
   https://msdl.microsoft.com/download/symbols: 570542 bytes - copied         
...
SYMSRV:  C:\ProgramData\dbg\sym\SOS_AMD64_AMD64_4.0.30319.18010.dll
   \5038768C95e000\SOS_AMD64_AMD64_4.0.30319.18010.dll not found

SYMSRV:  SOS_AMD64_AMD64_4.0.30319.18010.dll from 
   https://msdl.microsoft.com/download/symbols: 297048 bytes - copied         
...
Automatically loaded SOS Extension
...

In der vorherigen Ausgabe sehen Sie, dass der Debugger zuerst nach mscordacwks.dll und sos.dll auf dem lokalen Computer in C:\Windows\Microsoft.NET und im Symbolcache (C:\ProgramData\dbg\sym) gesucht hat. Wenn der Debugger die richtigen Versionen der Dateien auf dem lokalen Computer nicht gefunden hat, hat er sie vom öffentlichen Symbolserver abgerufen.

Um zu überprüfen, ob die Version von mscordacwks.dll mit der Version der CLR übereinstimmt, die die Anwendung verwendet hat, geben Sie einen der folgenden Befehle ein, um Informationen zum geladenen CLR-Modul anzuzeigen.

lmv -mclr (für Version 4.0 der CLR)

lmv -mscorwks (für Version 1.0 oder 2.0 der CLR)

Die Ausgabe sollte der folgenden ähneln.

start             end                 module name
000007ff`26710000 000007ff`2706e000   clr        (deferred)             
    Image path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
...

Beachten Sie im vorherigen Beispiel, dass die Version der CLR (clr.dll) mit der Produktversion der DAC (mscordacwks.dll) übereinstimmt: v4.0.30319. Beachten Sie auch, dass beide Komponenten 64-Bit sind.

Verwenden der SOS-Debugerweiterung

Um zu überprüfen, ob die SOS-Debugerweiterung ordnungsgemäß geladen wurde, geben Sie den Befehl .chain ein.

0:000> .chain
Extension DLL search Path:
...
Extension DLL chain:
    C:\ProgramData\dbg\sym\SOS_AMD64_AMD64_4.0.30319.18010.dll\...
        ...
    dbghelp: image 6.13.0014.1665, API 6.2.6, built Wed Dec 12 03:02:43 2012
...

Geben Sie zum Testen der SOS-Debugerweiterung !sos.help ein. Probieren Sie dann einen der Befehle aus, die von der SOS-Debugerweiterung bereitgestellt werden. Sie können z. B. !sos ausprobieren. DumpDomain oder die !sos. Threads-Befehl .

Hinweise

Manchmal lädt eine Anwendung mit verwaltetem Code mehr als eine Version der CLR. In diesem Fall müssen Sie angeben, welche Version der DAC geladen werden soll. Weitere Informationen finden Sie unter .cordll.