use*_*667 6 debugging conditional-breakpoint visual-studio-2008
我在C#代码上使用Visual Studio 2008.
如果另一个断点被击中(并打破了),我只想在断点处打破.有没有办法做到这一点?
我认为作为子问题,访问调试器具有的信息会很好.
这个的基本原理是我只对给定某个callstack(以及在callstack中执行其中一个函数的某个点)打破某个断点感兴趣.也许我应该使用callstack代替?另一个原因是编程访问调试器知道的东西会很有趣.
谢谢.
创建这样的条件断点的最简单方法是创建一个新的线程静态变量(如果它应该是全局的,则只是静态变量).假设我们的代码如下所示:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
我们现在假设你设置了breakpoint1 Console.WriteLine("test1");和breakpoint2 Console.WriteLine("test2");.只有当breakpoint1被击中2次时,你才想在breakpoint2处中断.在这种情况下,您需要Hit Count...将breapoint1的属性设置为break when the hit count is equal to 2.然后在When Hit...属性检查Print a message和文本框中输入{breakVariable = 1}::

然后将Condition...breakpoint2 的属性设置为breakVariable == 1并检查Is true:

如果您希望breakpoint2在被击中后变为非活动状态,您可以再次使用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
Run Code Online (Sandbox Code Playgroud)
现在对于breakpoint1,您仍然希望Hit Count...像以前一样设置属性,但现在在When Hit...属性中而不是检查Print a message检查Run a macro并选择SetMyBreakpoint过程.在Breakpoints.Add方法和正确的行中提供代码文件的完整路径非常重要(您可以检查API以找到设置断点的其他方法,例如在函数上代替代码文件).这里有一个小警告 - 我发现自动删除第二个断点并不总是有效 - 但也许是我的Visual Studio.
您可以再次使用Condition断点的属性 - 查看此问题以查找一些详细信息.
| 归档时间: |
|
| 查看次数: |
1132 次 |
| 最近记录: |