2013-10-01 19 views
5

Rozważmy następujący kod IL:JIT-ed implementacja obsługi wyjątku

.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 
    } 

jaki sposób CLR zdefiniować blok w kodzie JIT-ed try? Kod natywny wygląda w następujący sposób:

... 
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 

widzimy clr!JIT_EndCatch ale gdzie jest początek i koniec bloku try?

Odpowiedz

4

Jitter generuje o wiele więcej niż kod maszynowy, który można łatwo zobaczyć za pomocą debuggera. Będziesz chciał przeczytać this answer, mówi o tabelach, które generuje jitter, aby pomóc garbage collector.

Działa to bardzo podobnie do obsługi wyjątków, jitter generuje tabele funkcji używane przez implementację SafeSEH, aby system operacyjny mógł wykryć filtr wyjątków. Taka tabela zawiera wpisy dla adresu początkowego i końcowego bloku try-block i wskaźnika funkcji dla filtra. Dokładny sposób działania jest mocno niedostatecznie udokumentowany, obsługa wyjątków została w znacznym stopniu wykorzystana przez złośliwe oprogramowanie, a trafienia w google do "safeseh" nie są tym, co chcę tutaj powtórzyć. W artykule MSDN znajduje się kilka pobieżnych informacji na temat assembler's option. Nie jestem świadomy prostego sposobu na sprawdzenie tych tabel za pomocą debuggera.

Powiązane problemy