2014-01-18 7 views
5

einige Foren I über this answer in denen kamen die AntworterWas genau ist der native Call-Stack in Bezug auf die CLR?

00000000`0014ea10 00000642`7f67d4a2 0x642`80150142 
00000000`0014ea90 00000642`7f5108f5 mscorwks!CallDescrWorker+0x82 
00000000`0014eae0 00000642`7f522ff6 mscorwks!CallDescrWorkerWithHandler+0xe5 
00000000`0014eb80 00000642`7f49a94b mscorwks!MethodDesc::CallDescr+0x306 
00000000`0014edb0 00000642`7f474ae4 mscorwks!ClassLoader::RunMain+0x23f 
00000000`0014f010 00000642`7f5efb1a mscorwks!Assembly::ExecuteMainMethod+0xbc 
00000000`0014f300 00000642`7f467d97 mscorwks!SystemDomain::ExecuteMainMethod+0x492 
00000000`0014f8d0 00000642`7f482c24 mscorwks!ExecuteEXE+0x47 

Was genau ist der native Call-Stack in Bezug auf die CLR auf den folgenden wie der native Call-Stack bezeichnet (hier sind wir an der CLR rufenden suchen die Main-Methode, die ich denke) und wie kann ich den nativen Call-Stack auf meinem lokalen Rechner für Bildungszwecke sehen und verstehen?

Antwort

10

Ja, das sind unmanaged Funktionen in C++ geschrieben. Die Sprache, mit der die CLR geschrieben wurde.

Es gibt keinen grundlegenden Unterschied in der Art und Weise, in der nicht verwalteter Code den Stapel verwendet, verglichen mit der Art und Weise, wie verwalteter Code ihn verwendet. Der einzige Unterschied ist, dass Sie einen unmanaged Debugger benötigen, um die nicht verwalteten Funktionen in der Stack-Ablaufverfolgung zu sehen. Ein gemanagter Debugger meldet nur einen [Übergang vom System auf den systemeigenen Zustand] im Stack-Trace und blendet die nicht verwalteten Funktionen aus.

Was produktiv ist, sind Sie normalerweise nicht in nicht verwaltetem Code überhaupt interessiert und möglicherweise fehlen die erforderlichen PDBs, um die Ablaufverfolgung genau zu machen. Für die CLR muss der Microsoft Symbol Server aktiviert werden. Verwaltete Stack-Traces sind immer genau, die CLR gibt harte Garantien dafür, dass Stack-Walks gut funktionieren können, da der Garbage Collector und CAS Stack-Walks ausführen müssen, um ihre Arbeit zu erledigen. Nicht verwaltete Stack-Traces sind aufgrund von Optimierungen im C++ - Code-Generator schwieriger, die Frame-Pointer-Auslassung-Optimierung ist beispielsweise für das Stack-Gehen ziemlich tödlich.

Sie können sicherlich beide sehen. Projekt + Eigenschaften, Registerkarte Debuggen, aktivieren Sie die Option "Debuggen des systemeigenen Codes".

+0

Enorme Antwort. Vielen Dank. –

3

"Native Aufruf-Stack" bedeutet einen (Teil von) Call-Stack, der durch nicht verwaltete Bibliotheken geht. Sie haben immer einen nicht verwalteten Startpunkt für einen verwalteten Stapel, da das Betriebssystem nicht verwaltet wird. Sie können jedoch auch über nicht verwaltete Methoden verfügen, d. H. Wenn Ihr verwalteter Code Systemfunktionen aufruft. Ein Aufruf-Stack kann eine beliebige Anzahl von Übergängen zwischen verwalteten und nativen Überweisungen enthalten. Um überhaupt etwas Sinnvolles zu sehen, sollte "Unmanaged Debugging" aktiviert sein.

In Ihrem Beispiel oben sehen Sie Aufrufe, die aus mscorwks.dll stammen. Dies ist die Hauptdll, die die .NET-Ausführungsengine enthält. Da Symbole für diese Bibliothek fehlen (sofern Sie sie nicht heruntergeladen haben - siehe Google "Microsoft Symbol Server"), sehen Sie nur die Einstiegspunkte der verschiedenen Funktionen. Eine Zeile wie mscorwks!CallDescrWorkerWithHandler+0xe5 bedeutet, dass der Aufruf von einer Funktion namens "CallDescrWorkerWithHandler" in mscorwks.dll, 0xe5 Bytes vom Start dieser Funktion herrührt.