Как установить точку останова в каждом методе в VS2010 - программирование
Подтвердить что ты не робот

Как установить точку останова в каждом методе в VS2010

У меня есть более крупное (С#) приложение WPF с n-classes и m-methods. Я хотел бы поместить в каждом методе точку останова, поэтому каждый раз, когда я нажимаю кнопку в своем приложении или вызывается какой-либо метод, я хотел бы, чтобы приложение в VS2010 попало в эту точку останова. Я хочу понять поток/ход приложения.

И поскольку у меня есть много методов, я бы предпочел не размещать вручную в каждой и каждой из них точку останова.

Есть ли какая-либо команда или инструмент для размещения везде в моем решении VS2010 точки останова?

изменить: возможно, что-то вроде следующего addin: http://weblogs.asp.net/uruit/archive/2011/08/04/visual-studio-2010-addin-setting-a-class-breakpoint.aspx

edit2: есть ответы, но ни один из них не кажется простым решением. Что-нибудь еще?

4b9b3361

Ответ 1

EDIT: проверено только на С++

Я столкнулся с этой статьей, которая показывает, как установить точку останова в начале каждого метода в классе. Я тестировал его с помощью VS 2010. Основной процесс (при использовании Visual С++):

  • Перейти к Debug > Новая точка остановa > Точка останова в функции (Ctrl + B).
  • В поле "Функция" введите MyClass::*
  • Это будет отображаться как одна точка останова в окне Breakpoints, но как только один из методов MyClass будет удален, вы увидите точку останова в начале каждой функции в MyClass, и все эти будут "детьми" исходной точки останова в окне "Точки останова".

Я предполагаю, что это работает и с С#.

Ответ 2

Этот ответ предлагает макрос, который будет делать, как вы просите, но моя личная рекомендация будет заключаться в том, чтобы использовать профайлер - тот, который позволяет вам приостанавливать и возобновлять профилирование (почти все коммерческие профилировщики), а затем нажмите кнопку "Начать профилирование" непосредственно перед тем, как вы нажмете кнопку. Просмотр дерева вызовов в профилировщике часто является очень удобным способом получить представление о том, что делает приложение, гораздо больше, чем переходить в отладчик.

ОБНОВЛЕНИЕ:. Эта функция существует в расширении Visual Studio, над которым я работаю над вызовом OzCode. С помощью OzCode, когда вы нажимаете на значок рядом с определением класса, вы увидите QuickAction:

Add Breakpoint to every member in class

Ответ 3

Я думаю, вы создаете для него "аспект", используя такой инструмент, как: postsharp

Аспектно-ориентированное программирование позволяет добавлять код в начало или конец каждого метода (через шаг постобработки). Так что тривиально добавить строку:

 System.Diagnostics.Debugger.Break()

для каждого метода (без фактического редактирования всего исходного кода). Более типично он используется для добавления операторов журнала в начало каждого метода, например: "Ввод метода DrawLine (x = 30, y = 80, z = 12)" и в конце метода: "Метод останова DrawLine (x, у, г)". Что облегчает процесс вашей программы

Ответ 4

Здесь быстрый и грязный способ сделать это с помощью простого текста:

  • Отформатируйте свой файл С# так, чтобы все выемки были выровнены. Вы можете сделать это в Edit > Advanced > Format Document
  • Откройте текст, замените на Ctrl+H
  • Установите поле "Текст для поиска" "^ {".
  • Установите для поля "Заменить" значение " {System.Diagnostics.Debugger.Break();"
  • Нажмите маленькую кнопку "Использовать регулярные выражения" в окне
  • Нажмите "Заменить все" или нажмите Alt+A
  • Если в вашем файле есть классы с вложенными перечислениями, классами или структурами, у вас будут некоторые ошибки компилятора. Удалите вызовы Debug от них, пока ваш код не компилируется. Если ваши вложенные классы имеют свои собственные методы, вам придется снова запустить этот процесс с большим количеством вкладок в строках replace.

Как это работает: используется форматирование документов Visual Studio и предполагает, что все методы в файле начинаются с двух вкладок, а затем "{" . Таким образом, любая строка, начинающаяся с двух вкладок и "{" , будет заменена теми же двумя вкладками, тем же "{" и вызовом отладчика.

Если ваш файл имеет вложенные перечисления и т.д., вы получите ошибки компилятора, потому что замена текста не различает методы и перечисления. Например, вы увидите следующее:

enum MyColors
{ System.Diagnostics.Debugger.Break(); //error here
    Red,
    Green,
    Blue,
}

Если вы хотите отключить эти точки останова, лучший способ, о котором я могу думать, - это просто bool. Где-то в вашем коде вставьте это:

#if DEBUG
        private static bool _ignoreDebug = false;
#endif

(я помещаю #if DEBUG там как флаг, что этот код предназначен только для отладки. Это необязательно). Затем на шаге 4 выше вместо этого используйте эту замену:

"        {if(!_ignoreDebug){System.Diagnostics.Debugger.Break();}"

Затем, когда вы нажмете точку останова и больше не хотите ударяться, в окне просмотра введите это и нажмите enter _ignoreDebug = true. Чтобы снова включить его, вам нужно вставить ручную точку останова где-нибудь, у которой есть доступ к _ignoreDebug bool.


Чтобы удалить все это из вашего кода, либо замените другой текст, либо просто отредактируйте отменить все.

Ответ 5

Вы можете использовать мое расширение Runtime Flow для просмотра всех методов, вызываемых после нажатия кнопки, без установки точек останова.

Ответ 6

Вы можете использовать System.Diagnostics.Debugger.Break() при входе в ваш метод.

Что-то вроде этого, возможно, с bool, который вы установили в области?

#if DEBUG
  if (BreakPointEveryMethod)
    System.Diagnostics.Debugger.Break();
#endif

Будет быстрый способ добавить это точно в notepad++, но я не уверен, что для этого вы можете легко и просто выполнить это через простую командную строку.