2008-11-13 130 views
3

我使用的方法称为最近几万次开始抛出异常。在大多数调试环境中,我会在此方法的顶部设置一个断点,然后继续运行,直到遇到我感兴趣的调用触发异常的参数值。在这种情况下这将是不切实际的,所以我试图设置一个断点,只有当该参数值出现时才会断开。我在下面的位置创建了一个断点,并给它一个条件str == "OffendingValue"Visual Studio在使用断点条件进行调试时行为异常

class Foo 
{ 
    // Bar() is called many, many times 
    void Bar(string str) 
    { 
     try 
     { 
      // Breakpoint inserted here 
      ... 
     } 
     catch (Exception ex) 
     { 
      ... 
     } 
    } 
} 

令我惊讶的是,这样做导致Visual Studio和我的应用程序在调试模式下停止工作。我的应用程序启动并输出一些简单的日志消息,但后来完全停止响应由于需要做更多的工作来监控断点状况,因此思考Visual Studio可能会稍微慢一点,我离开办公桌15分钟让它有一段时间运行。当我回来时,没有任何变化。我可以通过删除断点并以相同的条件重新创建条件来重现条件。最奇怪的是,当我有这个有问题的断点时,Break All调试命令(通常会破坏当前正在执行它是否是断点的语句上的程序执行)不会执行任何操作。

有没有人遇到与Visual Studio断点条件类似的行为?我能够毫无问题地使用命中计数条件。

回答

7

任何时候,我试图在Visual Studio中使用条件断点我有同样的问题。调试器运行速度太慢,以至于无法使用。相反,我最终会临时向代码中添加一条if语句并在其中添加我的断点。这并不方便,但代码以正常的速度执行,它确实完成了工作。

class Foo 
{ 
    // Bar() is called many, many times 
    void Bar(string str) 
    { 
     try 
     { 

      if(str == "condition") 
      { 
       int i = 0; // Breakpoint inserted here 
      } 
      ... 
     } 
     catch (Exception ex) 
     { 
       ... 
     } 
    } 
} 
0

我不知道你是否得到堆栈溢出。 VS是否跟踪str的所有值或任何与Bar的每个状态有关的值?如果是这样,成千上万的副本可能会加起来。

我想知道是否可以通过全局变量而不是函数内的一个来消除监视值的问题。

2

如果您知道违规值是什么,您是否可以不为该方法编写单元测试并以此方式进行调试?

如果没有,如果您知道该异常,则可以将该调试器设置为在引发该异常时中断。转到Debug |异常和检查抛出异常的问题。

+0

这种方法在长时间的操作系列中取代了调用堆栈。我虽然没有单独为这种方法编写单元测试,但也许这是一个好方法。一个工作条件断点将是最简单的方法,这就是为什么我很好奇VS为什么不工作。 – Chris 2008-11-13 22:08:58

+0

我也发现一些VS的调试功能遇到问题时,他们被击中太多次。我认为VS只是落后于评估。因此,解决方法;) – 2008-11-14 14:31:07

相关问题