Использование локальной переменной
Самый простой способ создать такую условную точку останова - создать новую потоково-статическую переменную (или просто статическую, если она должна быть глобальной). Предположим, что наш код выглядит следующим образом:
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}
:
Затем установите для свойства Condition...
точки останова2 значение breakVariable == 1
и установите флажок Is true
:
Если вы хотите, чтобы точка останова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
точки останова - посмотрите на этот вопрос , чтобы найти некоторые детали.