2013-10-01 16 views
5

Si consideri il seguente codice IL:JIT-ed implementazione gestore di eccezioni

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

Come si CLR definire il blocco di try nel codice JIT-ed? Il codice nativo sembra seguente modo:

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

Possiamo vedere clr!JIT_EndCatch ma dove è l'inizio e la fine del blocco try?

risposta

4

Il jitter genera molto più del semplice codice macchina che è possibile vedere facilmente con il debugger. Ti consigliamo di leggere this answer, parla delle tabelle che il jitter genera per aiutare il garbage collector.

Che funziona in modo molto simile per la gestione delle eccezioni, il jitter genera tabelle di funzioni utilizzate dall'implementazione di SafeSEH per consentire al sistema operativo di rilevare il filtro delle eccezioni. Tale tabella contiene voci per l'indirizzo iniziale e finale del blocco try e un puntatore a funzione per il filtro. Il modo esatto in cui funziona è ampiamente documentato, la gestione delle eccezioni è stata sfruttata pesantemente da malware in passato e gli hit di Google per "safeseh" non sono qualcosa che voglio ripetere qui. Sono disponibili alcune informazioni sommarie nell'articolo MSDN per assembler's option. Non sono a conoscenza di un modo semplice per ispezionare queste tabelle con il debugger.