Условные точки останова в стеке вызовов

Можно ли указать точку останова в Visual Studio 2010, которая срабатывает только в том случае, если вызывающие методы вверх по стеку вызовов удовлетворяют определенному условию? Например, и, скорее всего, имя метода.

В идеале я ищу решение в самой Visual Studio, такое как условная точка останова, но я соглашусь на тестирование имен методов вверх по стеку в коде и наличие закодированной точки останова.

Чего я пытаюсь добиться, так это отключить звонки от определенного абонента.


person Adam Houldsworth    schedule 04.04.2011    source источник


Ответы (2)


Щелкните правой кнопкой мыши точку останова, выберите «Условие» и используйте что-то вроде этого:

new System.Diagnostics.StackTrace().ToString().Contains("YourMethodName")
person František Žiačik    schedule 04.04.2011
comment
Это загрузит всю трассировку стека, что сделает ее довольно жадной. Можно ли перебрать, скажем, последних 5 вызывающих абонентов и проверить их имена, в то же время подключая код к фрагменту Condition...? - person Adam Houldsworth; 04.04.2011
comment
Поскольку условие должно быть однострочным, вы можете использовать GetFrame(index) вместе с ||, но это сделает его еще менее эффективным. - person František Žiačik; 04.04.2011
comment
Кроме того, вы не можете использовать лямбда-выражения в условии. - person František Žiačik; 04.04.2011
comment
Но, в любом случае, основная проблема с производительностью здесь связана с созданием объекта StackTrace, а не с его строкой. :) Вам решать, приемлемо ли это. Если нет, вы всегда можете проверить это в своем коде и использовать Debugger.Break. - person František Žiačik; 04.04.2011
comment
Я никогда не подразумевал, что есть проблема с производительностью. Я подчеркивал тот факт, что вызов ToString на нем связывает весь фрейм стека в одну строку, поэтому я не могу в этот момент заявить, что меня интересует только непосредственный вызывающий абонент или 5-й вызывающий абонент. Поэтому я сказал, что это жадно, т.к. проверяет весь фрейм стека, а не только интересующие меня части. - person Adam Houldsworth; 04.04.2011
comment
Я отмечу ваш ответ для получения дополнительной информации об условных точках останова, но, поскольку мне нужен хороший контроль над состоянием стека, мне придется реализовать его физически в коде. Я собираюсь поиграть с созданием статического помощника, который дает мне однострочник, который я могу поставить в качестве условной точки останова :-) - person Adam Houldsworth; 04.04.2011
comment
@Adam Кстати, если вас интересует только непосредственный вызывающий объект, замените новый System.Diagnostics.Stack Trace () на новый System.Diagnostics.Stack Frame (). Если вас интересует 5-й вызывающий объект, замените его новым System.Diagnostics.Stack Frame(4). - person Omer Raviv; 04.04.2011

класс StackTrace должен дать вам то, что вам нужно.

StackTrace stackTrace = new StackTrace();           
StackFrame[] stackFrames = stackTrace.GetFrames(); 
person BrandonZeider    schedule 04.04.2011