2013-10-01 7 views
5

den folgenden IL-Code vor:JIT-ed Exception Handler Implementierung

.method public static void Main() 
    { 
     ldstr "Starts Here" 
     call void [mscorlib] System.Console::WriteLine(string) 
     .try {  
      ldstr "Try Me!" 
      call void [mscorlib] System.Console::WriteLine(string) 
      leave.s Done 
     } 
     catch [mscorlib] System.Exception { 
      ldstr "Catch Me!" 
      call void [mscorlib] System.Console::WriteLine(string) 
      leave.s Done 
     } 
    Done: 
     ldstr "Ends Here" 
     call void [mscorlib] System.Console::WriteLine(string) 
     ret 
    } 

Wie CLR den try Block in JIT-ed-Code nicht definiert? Der native Code sieht folgendermaßen:

... 
00900076 8b0538214703 mov  eax,dword ptr ds:[3472138h] ("Starts Here") 
... 

00900090 8b053c214703 mov  eax,dword ptr ds:[347213Ch] ("Try Me!") 
... 

009000a2 eb1b   jmp  009000bf ;// Done 

009000a4 8945d4   mov  dword ptr [ebp-2Ch],eax 
009000a7 8b0540214703 mov  eax,dword ptr ds:[3472140h] ("Catch Me!") 
... 

009000b8 e888293b73  call clr!JIT_EndCatch (73cb2a45) 
009000bd eb00   jmp  009000bf ;// Done 

;// Done: 
009000bf 8b0544214703 mov  eax,dword ptr ds:[3472144h] ("Ends Here") 
... 
009000d6 c3    ret 

Wir clr!JIT_EndCatch sehen können, aber wo ist der Anfang und das Ende des try Block?

Antwort

4

Der Jitter erzeugt viel mehr als nur den Maschinencode, den Sie mit dem Debugger leicht sehen können. Sie möchten this answer lesen, es spricht über die Tabellen, die der Jitter generiert, um den Garbage Collector zu unterstützen.

Der Jitter funktioniert in ähnlicher Weise für die Ausnahmebehandlung. Er generiert Funktionstabellen, die von der SafeSEH-Implementierung verwendet werden, damit das Betriebssystem den Ausnahmefilter erkennt. Eine solche Tabelle hat Einträge für die Start- und Endadresse des try-Blocks und einen Funktionszeiger für den Filter. Die genaue Funktionsweise ist stark unter dokumentiert, die Ausnahmebehandlung wurde in der Vergangenheit stark von Malware ausgenutzt, und Google-Hits für "Safeseh" sind nichts, was ich hier wiederholen möchte. Im MSDN-Artikel für die assembler's option finden Sie einige kursorische Informationen dazu. Ich kenne keine einfache Möglichkeit, diese Tabellen mit dem Debugger zu untersuchen.