【问题标题】:Conditional breakpoint dependent on caller enabling/disabling取决于调用者启用/禁用的条件断点
【发布时间】:2017-09-21 18:23:58
【问题描述】:

我有一个从很多很多地方调用的方法。

void foo()
{
    do_some_work();
}

调试会话的设置很痛苦。如果我正在调试这个:

void main()
{
    func1();   // which deep, deep down calls foo() over and over and over
    func2();   // which calls foo() over and over and over

    foo();     // This is the one that I actually want to debug
}

我想调试foo(),但只能从最后一次调用开始。没有方便的全局、公共、静态变量可以用来设置断点条件,我知道。

我真正想做的是这样的:

void main()
{
    func1();   // which deep, deep down calls foo() over and over and over
    func2();   // which calls foo() over and over and over

    Enable_debugger();
    foo();     // This is the one that I actually want to debug
}

在foo() 中设置我的断点,并为除最后一个实例之外的每个实例跳过它。

我可以采取什么方法吗?

为什么不直接在main() 中设置调试点然后介入呢?因为降级到foo() 是很多 步入。

编辑 我确实发现了一个小骗子。我可以这样做:

  System.Threading.Thread.SetData(
          System.Threading.Thread.GetNamedDataSlot("BREAKPOINT"), "on");

然后在上面设置条件断点:

 (string)System.Threading.Thread.GetData(
          System.Threading.Thread.GetNamedDataSlot("BREAKPOINT")) == "on"

【问题讨论】:

  • 据我所知,没有方便的全局、公共、静态变量可以用来设置断点。有什么理由不能添加?您可以在 main 中的 foo() 之前添加一个设置为 true 的全局变量,并在 foo() 中设置一个条件断点?
  • 根据您的 VS 版本,您可以右键单击断点并设置“条件”。其中一个条件是命中计数。因此,如果您可以确定确切的计数或最小阈值,您可以相应地设置。另外,嗨克林顿哈哈
  • @Clinton Pierce,看来您已经找到了解决方案,如果可能的话,您可以分享解决方案作为答案(不在问题/评论中)。所以你可以标记并关闭这个案例。

标签: c# visual-studio debugging


【解决方案1】:

如果您使用的是兼容版本的 Visual Studio,您可以设置 Conditional Breakpoints。我没有可用的版本列表,但最简单的方法是按照这些步骤操作并查看菜单选项是否适合您。

  1. 进入foo() 方法并在第一行设置断点
  2. 右键单击断点并单击“条件”
  3. 您可以从那里根据“命中计数器”设置条件:

如果您能找到想要跳过的foo() 呼叫的确切计数(甚至是最低阈值),那么这应该是解决您的问题的一种方法。

使用这种方法,您无需编写任何代码,您可以使用 IDE单独解决此问题。

【讨论】:

  • 不错的主意。虽然第一次获得命中数可能会很痛苦....但到目前为止是合理的。
【解决方案2】:

我会添加一个全局变量,例如 debugFoo,它在 main() 中调用 foo() 之前被初始化为 false 并设置为 true。

public static void foo()
{   // <-- Conditional breakpoint here.
    Console.WriteLine(debugFoo);
}

public static bool debugFoo = false;

public static void Main()
{
    foo();
    debugFoo = true;
    foo();
    Console.ReadLine();
}

然后在foo()内设置条件断点,条件为,

debugFoo == true

因此,根据您打开和关闭 debugFoo 的时间,您可以点击该断点。


编辑

如果两个彼此不可见,我会考虑的第二种方法是修改 foo() 的参数(如果有可能)。

public static void foo(bool doDebug = false)
{   // <-- Conditional breakpoint here
    Console.WriteLine(doDebug);
}

public static void Main()
{
    Console.WriteLine("No debug");
    foo();
    Console.WriteLine("Debug");
    foo(true);
    Console.ReadLine();
}

并设置条件断点:

doDebug == true

这样您不必修改对foo() 的其他现有调用,而是将true 传递给您要调试的main() 中的单个调用。

【讨论】:

  • 这仅在两个程序集彼此可见时才有效。出于这个原因,我已经排除了“全局变量”。没有任何进程。
  • 修改foo()的参数是不是选项?
猜你喜欢
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 2020-05-03
  • 2021-08-26
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
相关资源
最近更新 更多