Windbg устанавливает условные точки останова, которые зависят от стека вызовов - PullRequest
10 голосов
/ 17 октября 2011

Проблема : мне нужно создать скрипт или выражение, которое не будет разрываться, если где-то в 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 ]

12 голосов
/ 18 октября 2011

В 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
}
1 голос
/ 18 октября 2011

Почему бы не установить точку останова при входе в модуль! ClassA: MemberFunction, чтобы включить точку останова для модуля! MyFunctionWithConditionalBreakpoint, и после выхода из модуля! ClassA: MemberFunction, отключив его?

...