повредитесь каждый раз, когда файл (или класс) вводится

Может ли помочь Enum с атрибутом Flags? См. Здесь:

Что означает атрибут перечисления [Flags] Enable в C #?

19
задан JoelFan 12 February 2009 в 04:55
поделиться

22 ответа

Макросы могут быть Вашим другом. Вот макрос, который добавит, точка останова к каждому методу в текущем классе (поместите курсор где-нибудь в класс прежде, чем выполнить его).

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

Редактирование: Обновленный для добавления точки останова именем функции, а не файла/номера строки. Это 'чувствует себя' лучше и будет легче распознать в окне точек останова.

44
ответ дан 30 November 2019 в 01:46
поделиться

Безумный метод с помощью отражения. См. документацию для 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
}

можно затем передать в имени класса как аргумент во время выполнения (через командную строку, если Вы хотите) установить точки останова на всех методах и конструкторах данного класса.

0
ответ дан 30 November 2019 в 01:46
поделиться

Joel, ответ, кажется, "нет". Нет пути без точки останова в каждом методе.

0
ответ дан 30 November 2019 в 01:46
поделиться

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

, Чтобы сделать то же с типом (который действительно существует во времени выполнения) может быть сделанным, но вероятно быть очень навязчивым, создавая более потенциальный для heisenbugs. "Самый легкий" маршрут к этому, вероятно, будет использовать инфраструктуру дистанционной работы.NET прокси (см. реализацию MOQ для примера использования прозрачного прокси).

Сводка: используйте макрос или выберите все сопровождаемые точкой останова набора (ctrl-A, F9).

0
ответ дан 30 November 2019 в 01:46
поделиться

Можно использовать Debugger.Launch() и Debugger.Break() в блоке System.Diagnostics

0
ответ дан 30 November 2019 в 01:46
поделиться

Если Вы готовы использовать макрос затем принятый ответ от , этот вопрос

Должен быть тривиально конвертируемым Вам потребности путем создания поискового поиска функции методов, свойств и конструкторов (как желаемый), существует также вполне возможно способ получить ту же информацию от язь/символы, который будет более стабильным (хотя, возможно, немного более сложный).

0
ответ дан 30 November 2019 в 01:46
поделиться

ЕСЛИ это - C++, Вы говорите о, то Вам могло, вероятно, сойти с рук, (адская партия работы) установка точки останова в коде преамбулы в CRT или написания кода, которое изменяет код преамбулы для засовывания INT 3 там только для функций, сгенерированных от рассматриваемого класса... Это, BTW, CAN быть сделанным во времени выполнения... У Вас должен был бы быть файл PE, это сгенерировано, изменяют себя, возможно перед перемещением, для засовывания всего повреждения там...

Мое только другое предложение состояло бы в том, чтобы записать Макрос, который использует предопределенный макрос _ _ FUNCTION_ _ в котором Вы ищете любую функцию, которую это - часть рассматриваемого класса, и при необходимости, палка

__asm { int 3 }

в Вашем макросе, чтобы заставить VS повредить... Это будет препятствовать тому, чтобы Вы имели для установки точек останова в начале каждой функции, но необходимо было бы все еще засунуть макро-вызов, который намного лучше, если Вы спрашиваете меня. Я думаю, что читал где-нибудь о том, как можно определить или переопределить код преамбулы, которым это называют на функцию.. Я буду видеть то, что я могу найти.

я думал бы я, подобный взлом мог использоваться для обнаружения, какой ФАЙЛ Вы вводите, но ВСЕ ЕЩЕ необходимо поместить функциональный макрос на всем протяжении кода, или это никогда не будут называть, и, ну, в общем, это в значительной степени, что Вы не хотели делать.

0
ответ дан 30 November 2019 в 01:46
поделиться
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;
}

на функции входят, она ворвется в отладчик

0
ответ дан 30 November 2019 в 01:46
поделиться

Вы могли поместить точку останова памяти на это и установить ее на на чтении. Я думаю, что должно быть чтение большую часть времени, Вы называете функцию членства. Я не уверен в статических функциях.

0
ответ дан 30 November 2019 в 01:46
поделиться

Вы могли записать метод обертки, через который Вы выполняете КАЖДЫЙ вызов в своем приложении. Затем Вы устанавливаете точку останова в том отдельном методе. Но... Вы были бы сумасшедшими сделать такую вещь.

0
ответ дан 30 November 2019 в 01:46
поделиться

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

0
ответ дан 30 November 2019 в 01:46
поделиться

Разве самый простой метод не должен становиться самым близким к этому для простой установки точки останова в конструкторе (предполагающий, что у Вас есть только один - или каждый из них в случае нескольких конструкторов)?

Это ворвется в отладку, когда класс сначала инстанцируют в случае нестатического конструктора, и в случае статического конструктора/класса, Вы ворветесь в отладку, как только Visual Studio решает инициализировать Ваш класс.

Это, конечно, препятствует тому, чтобы Вы имели для установки точки останова в каждый метод в классе.

, Конечно, Вы не продолжите врываться в отладку на последующем возвращении к коду класса (предполагающий использование того же инстанцированного объекта в следующий раз вокруг) однако, если Вы повторно инстанцируете нового объекта каждый раз из кода вызова, Вы могли бы моделировать это.

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

1
ответ дан 30 November 2019 в 01:46
поделиться

Используйте Отладчик. Повреждение (); (от Системы. Пространство имен диагностики)

Помещенный это во главе каждой функции Вы хотите "повредиться"

void MyFunction()
{
    Debugger.Break();
    Console.WriteLine("More stuff...");
}
1
ответ дан 30 November 2019 в 01:46
поделиться

Нет. Или скорее да, но это включает установку точки останова в начале каждого метода.

1
ответ дан 30 November 2019 в 01:46
поделиться

Вы могли записать макрос Visual Studio, который получил список всех методов класса (скажите путем чтения .map файл, произведенный вместе с исполняемым файлом и поиска его надлежащие имена символа (и затем demangling те имена)), и затем использовал Breakpoints.add() , чтобы программно добавить точки останова к тем функциям.

4
ответ дан 30 November 2019 в 01:46
поделиться
System.Diagnostics.Debugger.Break();

(в начале каждого метода)

3
ответ дан 30 November 2019 в 01:46
поделиться

Это хорошо работает в WinDbg:

bm exename!CSomeClass::*

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

6
ответ дан 30 November 2019 в 01:46
поделиться

Эта опция реализована в VS для собственного C++. crtl-B и указывают 'функцию' как "Имя класса::*", это устанавливает точку останова в начале каждого метода на классе. Набор точек останова группируется в окне точек останова (ctrl-alt-B), таким образом, им можно включить, отключить и удалить как группа.

Печально макрос вероятен лучший выбор для управляемого кода.

8
ответ дан 30 November 2019 в 01:46
поделиться

Ну, как все говорят, это включает установку точки останова в начале каждого метода. Но Вы не видите большее изображение.

, Чтобы это работало вообще, точка останова должна быть установлена в начале каждого метода. Делаете ли Вы это вручную, или отладчик делает это автоматически, те точки останова должны быть установлены, чтобы это работало.

Так, вопрос действительно становится, "Если там действительно потребность в этой функциональности, что стоит встроить в отладчик автоматическое средство установки всех тех точек останова?". И ответ, "Едва ли".

8
ответ дан 30 November 2019 в 01:46
поделиться

Возможно, Вы могли использовать платформу 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.

10
ответ дан 30 November 2019 в 01:46
поделиться

Вы могли запустить путем представления своего рода Аспектно-ориентированного программирования - видят, например это объяснение - и затем помещают точку останова в единственный метод OnEnter.

, В зависимости от которой платформы AOP Вы выбираете, она потребовала бы небольшого художественного оформления в Вашем коде и представила бы немного служебное (что можно удалить позже), но по крайней мере Вы не должны будете устанавливать точки останова везде. В некоторых платформах Вы могли бы даже смочь представить его без изменения кода вообще, просто XML-файл на стороне?

13
ответ дан 30 November 2019 в 01:46
поделиться

Предположение, что Вы только интересуетесь открытыми методами т.е. когда методы класса называют "снаружи", я включу Дизайн Контракта еще раз.

можно выработать привычку записи государственных функций как это:

public int Whatever(int blah, bool duh)
{
    // INVARIANT (i)
    // PRECONDITION CHECK (ii)

    // BODY (iii)

    // POSTCONDITION CHECK (iv)
    // INVARIANT (v)

}

Затем можно использовать Инвариант () функция, которую Вы вызовете в (i), и устанавливает точку останова в нем . Затем осмотрите стек вызовов для знания, куда Вы происходите из. Конечно, Вы назовете его в (v), также; если Вы действительно интересуетесь только точками входа, Вы могли бы использовать функцию помощника для вызова Инварианта от (i) и другого от (v).

, Конечно, это - дополнительный код, но

  1. Это - полезный код так или иначе, и структура является шаблоном при использовании Дизайна Контракта.
  2. Иногда Вы хотите, чтобы точки останова исследовали некоторое неправильное поведение, например, состояние недопустимого объекта, в этом случае инварианты могли бы быть бесценными.

Для объекта, который всегда доступен, Инвариант () функция просто имеет тело, которое возвращает true. Можно все еще поместить точку останова там.

Это - просто идея, это по общему признанию имеет шаг, поэтому просто рассмотрите это и используйте его, если Вам нравится он.

1
ответ дан 30 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: