прерывать всякий раз, когда файл (или класс) введен - PullRequest
18 голосов
/ 30 октября 2008

Есть ли в Visual Studio какой-либо способ прерывать работу отладчика при вводе определенного файла (или класса)? Пожалуйста, не отвечайте «просто установите точку останова в начале каждого метода» :)

Я использую C #.

Ответы [ 23 ]

43 голосов
/ 12 февраля 2009

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

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

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

13 голосов
/ 12 февраля 2009

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

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

10 голосов
/ 13 февраля 2009

Возможно, вы могли бы использовать AOP-фреймворк, такой как PostSharp, чтобы проникать в отладчик при каждом входе в метод. Взгляните на очень краткое руководство по на этой странице , чтобы узнать, как вы можете регистрировать / отслеживать каждый раз, когда вводится метод.

Вместо записи в журнал вы можете поместить оператор Debugger.Break () в обработчик OnEntry. Хотя отладчик остановился бы не на ваших методах, а на обработчике OnEntry (поэтому я не уверен, действительно ли это помогает).

Вот очень простой пример:

Класс аспекта определяет обработчик OnEntry, который вызывает Debugger.Break ():

[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.

8 голосов
/ 18 февраля 2009

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

К сожалению, макрос, вероятно, лучшая ставка для управляемого кода.

8 голосов
/ 30 октября 2008

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

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

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

6 голосов
/ 12 февраля 2009

Это прекрасно работает в WinDbg:

bm exename!CSomeClass::*

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

4 голосов
/ 12 февраля 2009

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

3 голосов
/ 30 октября 2008
System.Diagnostics.Debugger.Break();

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

1 голос
/ 08 сентября 2010

Чтобы удалить точки останова, установленные принятым ответом, добавьте еще один макрос со следующим кодом

Public Sub RemoveBreakOnAnyMember()
    Dim debugger As EnvDTE.Debugger = DTE.Debugger

    Dim bps As Breakpoints
    bps = debugger.Breakpoints

    If (bps.Count > 0) Then
        Dim bp As Breakpoint
        For Each bp In bps
            Dim split As String() = bp.File.Split(New [Char]() {"\"c})

            If (split.Length > 0) Then
                Dim strName = split(split.Length - 1)
                If (strName.Equals(DTE.ActiveDocument.Name)) Then
                    bp.Delete()
                End If
            End If
        Next
    End If
End Sub
1 голос
/ 30 октября 2008

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

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