Windbg устанавливает условные точки останова, которые зависят от стека вызовов
Проблема: мне нужно сделать скрипт или выражение, которое не ломается, если где-то в callstack есть функция с конкретным именем.
Конкретный вопрос: Как я могу получить функции из стека вызовов в список строк?
Пример:
Module!MyFunctionWithConditionalBreakpoint
Module!Function1
Module!Function2
Module!Function3
Module!MyFunctionWithConditionalBreakpoint
Module!Function1
Module!ClassA:MemberFunction
Module!Function3
я хочу Module!MyFunctionWithConditionalBreakpoint
сломать, только если звонок поступил из Module!ClassA:MemberFunction
Мне нужно это в неуправляемом коде. Управляемое решение - это что-то вроде
System.Diagnostics.StackTrace().ToString(). Содержит ("YourMethodName")
2 ответа
В WinDbg вы можете установить условную точку останова, используя специальную функцию $spat:
bp Module!MyFunctionWithConditionalBreakpoint "r $t0 = 0;.foreach (v { k }) { .if ($spat(\"v\", \"*Module!ClassA:MemberFunction*\")) { r $t0 = 1;.break } }; .if($t0 = 0) { gc }"
В псевдокоде это будет что-то вроде:
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
}
Почему бы не установить точку останова при входе в Module!ClassA:MemberFunction, чтобы включить точку останова для Module!MyFunctionWithConditionalBreakpoint, и после выхода из Module!ClassA:MemberFunction, отключив ее?