gpt4 book ai didi

visual-studio-2008 - 将一个断点的命中计数用于另一个断点的条件

转载 作者:行者123 更新时间:2023-12-04 14:49:52 24 4
gpt4 key购买 nike

我在 C# 代码上使用 Visual Studio 2008。

如果另一个断点被击中(并被打破),我只想在一个断点上中断。有没有办法做到这一点?

我想作为一个子问题,访问调试器拥有的信息会很好。

这样做的基本原理是我只对给定某个调用堆栈的某个断点感兴趣(以及在调用堆栈中执行这些函数之一的某个点)。也许我应该改用调用堆栈?另一个原因是对调试器知道的内容进行编程访问会很有趣。

谢谢。

最佳答案

使用局部变量

创建这样一个条件断点的最简单方法是创建一个新的线程静态变量(或者如果它应该是全局的就只是静态变量)。假设我们的代码如下所示:

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");
}
}

现在让我们假设您在 Console.WriteLine("test1"); 上设置了一个断点 1和断点 2 位于 Console.WriteLine("test2"); .只有当断点 1 被击中 2 次时,您才希望在断点 2 处中断。在这种情况下,您需要设置 Hit Count...断点 1 的属性到 break when the hit count is equal to 2 .然后在 When Hit...属性(property)检查 Print a message并在文本框中输入: {breakVariable = 1} :

when break

然后设置属性 Condition...断点 2 到 breakVariable == 1并检查 Is true :

condition

如果您希望 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

现在对于断点 1,您仍然要设置 Hit Count...属性和以前一样,但现在在 When Hit...属性而不是检查 Print a message检查 Run a macro并选择 SetMyBreakpoint程序。在 Breakpoints.Add 中提供代码文件的完整路径非常重要。方法和正确的行(您可以检查 API 以找到其他设置断点的方法,例如在函数上而不是代码文件上)。这里有一个小小的警告——我观察到第二个断点的自动删除并不总是有效——但也许是我的 Visual Studio。

使用调用堆栈

您可以再次使用 Condition断点的属性 - 看看 this question找到一些细节。

关于visual-studio-2008 - 将一个断点的命中计数用于另一个断点的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8424226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com