2011-10-17 16 views
9

Problema: Necesito hacer una secuencia de comandos o una expresión que no se rompa si en alguna parte de la pila de llamadas hay una función con un nombre específico.Windbg Establecer puntos de interrupción condicionales que dependen de la Pila de llamadas

Pregunta específica: ¿Cómo puedo obtener funciones de callstack en una lista de cadenas?

Ejemplo:

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


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

Quiero Module!MyFunctionWithConditionalBreakpoint para romper sólo si la llamada cames de Module!ClassA:MemberFunction

necesito esto en código no administrado. solución administrada es algo así como

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

Respuesta

11

En WinDbg puede establecer un punto de interrupción condicional utilizando la función especial de $ escupió:..

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

En pseudo-código que será algo como:

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

funciona muy bien. gracias – cprogrammer

1

¿Por qué no establecer un punto de interrupción al ingresar al Módulo! ClassA: MemberFunction para habilitar un punto de interrupción para el Módulo! MyFunctionWithConditionalBreakpoint y al salir Module! ClassA: MemberFunction inhabilitándolo?

+0

¿Podría esto ser automatizado? –

Cuestiones relacionadas