2011-10-17 12 views
9

Il problema: Ho bisogno di fare uno script o un'espressione che che non si rompe se da qualche parte su stack è una funzione con un nome specifico.Windbg Set condizionali punti di interruzione che dipende Stack di chiamate

Domanda specifica: Come posso ottenere funzioni su un callstack a un elenco di stringhe?

Esempio:

Module!MyFunctionWithConditionalBreakpoint  
Module!Function1 
Module!Function2  
Module!Function3 


Module!MyFunctionWithConditionalBreakpoint  
Module!Function1 
Module!ClassA:MemberFunction  
Module!Function3 

voglio Module!MyFunctionWithConditionalBreakpoint rompere solo se la chiamata cames da Module!ClassA:MemberFunction

ho bisogno di questo nel codice non gestito. soluzione gestita è qualcosa di simile

System.Diagnostics.StackTrace() ToString() Contiene ("YourMethodName")

risposta

11

In WinDbg è possibile impostare un punto di interruzione condizionale mediante funzione speciale $ sputò:..

bp Module!MyFunctionWithConditionalBreakpoint "r $t0 = 0;.foreach (v { k }) { .if ($spat(\"v\", \"*Module!ClassA:MemberFunction*\")) { r $t0 = 1;.break } }; .if($t0 = 0) { gc }" 

In pseudo-codice sarà qualcosa del tipo:

t0 = 0 
foreach (token in k-command result) { 
    if (token.contains("Module!ClassA:MemberFunction")) { 
    t0 = 1 
    break 
    } 
} 
if (t0 == 0) { 
    // continue execution 
} else { 
    // break into the debugger 
} 
+0

funziona benissimo. grazie – cprogrammer

1

Perché non impostare un punto di interruzione quando si accede al modulo ClassA: MemberFunction per abilitare un punto di interruzione per Module! MyFunctionWithConditionalBreakpoint e all'uscita dal modulo! ClassA: MemberFunction disattivandolo?

+0

Potrebbe essere automatizzato? –