использовать количество попаданий одной точки останова для состояния другой точки останова - PullRequest
6 голосов
/ 08 декабря 2011

Я использую Visual Studio 2008 для кода C #.

Я хотел бы прерывать точку останова только в том случае, если другая точка останова была достигнута (и сломана). Есть ли способ сделать это?

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

Спасибо.

1 Ответ

7 голосов
/ 08 декабря 2011

Использование локальной переменной

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

class Program
{
#if DEBUG
    [ThreadStatic]
    static int breakVariable = 0;
#endif

    static void Main(string[] args)
    {
        TestMethod2();

        TestMethod1();
        TestMethod2();

        TestMethod2();

        TestMethod1();
        TestMethod2();
    }

    static void TestMethod1()
    {
        Console.WriteLine("test1");
    }

    static void TestMethod2()
    {
        Console.WriteLine("test2");
    }
}

Давайте теперь предположим, что вы установили точку останова 1 на Console.WriteLine("test1"); и точку останова 2 на Console.WriteLine("test2");. Вы хотели бы остановиться на точке останова 2 только тогда, когда на точку останова 1 был нанесен удар 2 раза. В этом случае вам нужно установить Hit Count... свойство breapoint1 в break when the hit count is equal to 2. Затем в свойстве When Hit... отметьте Print a message и введите в текстовом поле: {breakVariable = 1}:

when break

Затем установите для свойства Condition... точки останова2 значение breakVariable == 1 и установите флажок Is true:

condition

Если вы хотите, чтобы точка останова2 стала неактивной после удара, вы можете снова использовать свойство When Hit..., установив для Print a message значение {breakVariable=0}.

Использование макроса

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

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module Module1

    Public Sub SetMyBreakpoint()
        Dim bps As EnvDTE.Breakpoints
        bps = DTE.Debugger.Breakpoints.Add(File:="C:\MyProject\ConsoleApplication1\Program.cs", _
                                           Line:=25)
        Dim bp As EnvDTE80.Breakpoint2
        For Each bp In bps
            bp.Tag = "mytag"
            ' Add this line only if you want the breakpoint to be removed on hit
            ' Although I don't know why - it does not always worked :(
            bp.Macro = "Macros.MyMacros.Module1.RemoveMyBreakpoint"
        Next
    End Sub

    Public Sub RemoveMyBreakpoint()
        Dim bp As EnvDTE.Breakpoint
        For Each bp In DTE.Debugger.Breakpoints
            If (bp.Tag = "mytag") Then
                bp.Delete()
            End If
        Next
    End Sub
End Module

Теперь для точки останова1 вы все равно хотите установить свойство Hit Count..., как и раньше, но теперь в свойстве When Hit... вместо проверки Print a message, проверки Run a macro и выбора процедуры SetMyBreakpoint. Очень важно, чтобы вы указали полный путь к файлу кода в методе Breakpoints.Add и правильную строку (вы можете проверить API, чтобы найти другие способы установки точки останова, например, для функции вместо файла кода). Одно маленькое замечание: я заметил, что автоматическое удаление второй точки останова не всегда работает, но, возможно, это была моя Visual Studio.

Использование стека вызовов

Вы можете снова использовать свойство Condition точки останова - посмотрите на этот вопрос , чтобы найти некоторые детали.

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