Может ли помочь Enum с атрибутом Flags? См. Здесь:
Макросы могут быть Вашим другом. Вот макрос, который добавит, точка останова к каждому методу в текущем классе (поместите курсор где-нибудь в класс прежде, чем выполнить его).
Public Module ClassBreak
Public Sub BreakOnAnyMember()
Dim debugger As EnvDTE.Debugger = DTE.Debugger
Dim sel As EnvDTE.TextSelection = DTE.ActiveDocument.Selection
Dim editPoint As EnvDTE.EditPoint = sel.ActivePoint.CreateEditPoint()
Dim classElem As EnvDTE.CodeElement = editPoint.CodeElement(vsCMElement.vsCMElementClass)
If Not classElem Is Nothing Then
For Each member As EnvDTE.CodeElement In classElem.Children
If member.Kind = vsCMElement.vsCMElementFunction Then
debugger.Breakpoints.Add(member.FullName)
End If
Next
End If
End Sub
End Module
Редактирование: Обновленный для добавления точки останова именем функции, а не файла/номера строки. Это 'чувствует себя' лучше и будет легче распознать в окне точек останова.
Безумный метод с помощью отражения. См. документацию для MethodRental.SwapMethodBody
для деталей. В псевдокоде:
void SetBreakpointsForAllMethodsAndConstructorsInClass (string classname)
{
find type information for class classname
for each constructor and method
get MSIL bytes
prepend call to System.Diagnostics.Debugger.Break to MSIL bytes
fix up MSIL code (I'm not familiar with the MSIL spec. Generally, absolute jump targets need fixing up)
call SwapMethodBody with new MSIL
}
можно затем передать в имени класса как аргумент во время выполнения (через командную строку, если Вы хотите) установить точки останова на всех методах и конструкторах данного класса.
Joel, ответ, кажется, "нет". Нет пути без точки останова в каждом методе.
Файлы не имеют никакого существования во времени выполнения (полагайте, что частичные классы не отличаются - с точки зрения кода - от помещения всего в единственном файле). Поэтому макро-подход (или код в каждом методе) требуется.
, Чтобы сделать то же с типом (который действительно существует во времени выполнения) может быть сделанным, но вероятно быть очень навязчивым, создавая более потенциальный для heisenbugs. "Самый легкий" маршрут к этому, вероятно, будет использовать инфраструктуру дистанционной работы.NET прокси (см. реализацию MOQ для примера использования прозрачного прокси).
Сводка: используйте макрос или выберите все сопровождаемые точкой останова набора (ctrl-A, F9).
Можно использовать Debugger.Launch()
и Debugger.Break()
в блоке System.Diagnostics
Если Вы готовы использовать макрос затем принятый ответ от , этот вопрос
Должен быть тривиально конвертируемым Вам потребности путем создания поискового поиска функции методов, свойств и конструкторов (как желаемый), существует также вполне возможно способ получить ту же информацию от язь/символы, который будет более стабильным (хотя, возможно, немного более сложный).
ЕСЛИ это - C++, Вы говорите о, то Вам могло, вероятно, сойти с рук, (адская партия работы) установка точки останова в коде преамбулы в CRT или написания кода, которое изменяет код преамбулы для засовывания INT 3 там только для функций, сгенерированных от рассматриваемого класса... Это, BTW, CAN быть сделанным во времени выполнения... У Вас должен был бы быть файл PE, это сгенерировано, изменяют себя, возможно перед перемещением, для засовывания всего повреждения там...
Мое только другое предложение состояло бы в том, чтобы записать Макрос, который использует предопределенный макрос _ _ FUNCTION_ _ в котором Вы ищете любую функцию, которую это - часть рассматриваемого класса, и при необходимости, палка
__asm { int 3 }
в Вашем макросе, чтобы заставить VS повредить... Это будет препятствовать тому, чтобы Вы имели для установки точек останова в начале каждой функции, но необходимо было бы все еще засунуть макро-вызов, который намного лучше, если Вы спрашиваете меня. Я думаю, что читал где-нибудь о том, как можно определить или переопределить код преамбулы, которым это называют на функцию.. Я буду видеть то, что я могу найти.
я думал бы я, подобный взлом мог использоваться для обнаружения, какой ФАЙЛ Вы вводите, но ВСЕ ЕЩЕ необходимо поместить функциональный макрос на всем протяжении кода, или это никогда не будут называть, и, ну, в общем, это в значительной степени, что Вы не хотели делать.
you can use the following macro:
#ifdef _DEBUG
#define DEBUG_METHOD(x) x DebugBreak();
#else
#define DEBUG_METHOD(x) x
#endif
#include <windows.h>
DEBUG_METHOD(int func(int arg) {)
return 0;
}
на функции входят, она ворвется в отладчик
Вы могли поместить точку останова памяти на это и установить ее на на чтении. Я думаю, что должно быть чтение большую часть времени, Вы называете функцию членства. Я не уверен в статических функциях.
Вы могли записать метод обертки, через который Вы выполняете КАЖДЫЙ вызов в своем приложении. Затем Вы устанавливаете точку останова в том отдельном методе. Но... Вы были бы сумасшедшими сделать такую вещь.
Не то, чтобы я знаю. Лучшее, которое можно сделать, должно поместить точку останова в каждый метод в файле или классе. Что Вы пытаетесь сделать? Вы пытаетесь выяснить то, что метод заставляет что-то изменять? Если так, возможно, точка прерывания по данным будет более соответствующей.
Разве самый простой метод не должен становиться самым близким к этому для простой установки точки останова в конструкторе (предполагающий, что у Вас есть только один - или каждый из них в случае нескольких конструкторов)?
Это ворвется в отладку, когда класс сначала инстанцируют в случае нестатического конструктора, и в случае статического конструктора/класса, Вы ворветесь в отладку, как только Visual Studio решает инициализировать Ваш класс.
Это, конечно, препятствует тому, чтобы Вы имели для установки точки останова в каждый метод в классе.
, Конечно, Вы не продолжите врываться в отладку на последующем возвращении к коду класса (предполагающий использование того же инстанцированного объекта в следующий раз вокруг) однако, если Вы повторно инстанцируете нового объекта каждый раз из кода вызова, Вы могли бы моделировать это.
Однако в стандартных терминах, нет никакого простого способа установить точку одиночного разрыва в одном месте (например), и иметь ее, врываются в отладку каждый раз, когда код класса (от какой бы ни метод) вводится (насколько я знаю).
Используйте Отладчик. Повреждение (); (от Системы. Пространство имен диагностики)
Помещенный это во главе каждой функции Вы хотите "повредиться"
void MyFunction()
{
Debugger.Break();
Console.WriteLine("More stuff...");
}
Нет. Или скорее да, но это включает установку точки останова в начале каждого метода.
Вы могли записать макрос Visual Studio, который получил список всех методов класса (скажите путем чтения .map
файл, произведенный вместе с исполняемым файлом и поиска его надлежащие имена символа (и затем demangling те имена)), и затем использовал Breakpoints.add()
, чтобы программно добавить точки останова к тем функциям.
System.Diagnostics.Debugger.Break();
(в начале каждого метода)
Это хорошо работает в WinDbg:
bm exename!CSomeClass::*
(Просто для уточнения, вышеупомянутая строка устанавливает точку останова на всех функциях в классе, точно так же, как OP просит, не обращаясь к взламыванию CRT или макро-глупости)
Эта опция реализована в VS для собственного C++. crtl-B и указывают 'функцию' как "Имя класса::*", это устанавливает точку останова в начале каждого метода на классе. Набор точек останова группируется в окне точек останова (ctrl-alt-B), таким образом, им можно включить, отключить и удалить как группа.
Печально макрос вероятен лучший выбор для управляемого кода.
Ну, как все говорят, это включает установку точки останова в начале каждого метода. Но Вы не видите большее изображение.
, Чтобы это работало вообще, точка останова должна быть установлена в начале каждого метода. Делаете ли Вы это вручную, или отладчик делает это автоматически, те точки останова должны быть установлены, чтобы это работало.
Так, вопрос действительно становится, "Если там действительно потребность в этой функциональности, что стоит встроить в отладчик автоматическое средство установки всех тех точек останова?". И ответ, "Едва ли".
Возможно, Вы могли использовать платформу AOP, такую как PostSharp для вторжения в отладчик каждый раз, когда метод вводится. Взгляните на очень короткое учебное руководство на эта страница для примера, как можно регистрировать/прослеживать каждый раз, когда метод вводится.
Вместо входа, в Вашем случае Вы могли поместить Отладчик. Повреждение () оператор в OnEntry-обработчик. Хотя, отладчик не остановился бы в Ваших методах, но в OnEntry-обработчике (таким образом, я не уверен, помогает ли это действительно).
Вот очень простой образец:
класс аспекта определяет обработчик OnEntry, который называет Отладчик. Повреждение ():
[Serializable]
public sealed class DebugBreakAttribute : PostSharp.Laos.OnMethodBoundaryAspect
{
public DebugBreakAttribute() {}
public DebugBreakAttribute(string category) {}
public string Category { get { return "DebugBreak"; } }
public override void OnEntry(PostSharp.Laos.MethodExecutionEventArgs eventArgs)
{
base.OnEntry(eventArgs);
// debugger will break here. Press F10 to continue to the "real" method
System.Diagnostics.Debugger.Break();
}
}
я могу затем применить этот аспект к своему классу, где я хочу, чтобы отладчик повредился каждый раз, когда метод называют:
[DebugBreak("DebugBreak")]
public class MyClass
{
public MyClass()
{
// ...
}
public void Test()
{
// ...
}
}
Теперь, если я создаю и запускаю приложение, отладчик остановит в OnEntry () обработчик каждый раз, когда один из методов MyClass называют. Все, что я должен сделать затем, должен нажать F10, и я нахожусь в методе MyClass.
Вы могли запустить путем представления своего рода Аспектно-ориентированного программирования - видят, например это объяснение - и затем помещают точку останова в единственный метод OnEnter.
, В зависимости от которой платформы AOP Вы выбираете, она потребовала бы небольшого художественного оформления в Вашем коде и представила бы немного служебное (что можно удалить позже), но по крайней мере Вы не должны будете устанавливать точки останова везде. В некоторых платформах Вы могли бы даже смочь представить его без изменения кода вообще, просто XML-файл на стороне?
Предположение, что Вы только интересуетесь открытыми методами т.е. когда методы класса называют "снаружи", я включу Дизайн Контракта еще раз.
можно выработать привычку записи государственных функций как это:
public int Whatever(int blah, bool duh)
{
// INVARIANT (i)
// PRECONDITION CHECK (ii)
// BODY (iii)
// POSTCONDITION CHECK (iv)
// INVARIANT (v)
}
Затем можно использовать Инвариант () функция, которую Вы вызовете в (i), и устанавливает точку останова в нем . Затем осмотрите стек вызовов для знания, куда Вы происходите из. Конечно, Вы назовете его в (v), также; если Вы действительно интересуетесь только точками входа, Вы могли бы использовать функцию помощника для вызова Инварианта от (i) и другого от (v).
, Конечно, это - дополнительный код, но
Для объекта, который всегда доступен, Инвариант () функция просто имеет тело, которое возвращает true. Можно все еще поместить точку останова там.
Это - просто идея, это по общему признанию имеет шаг, поэтому просто рассмотрите это и используйте его, если Вам нравится он.