使用断点条件调试时,Visual Studio表现异常

3
我通常使用的一种方法最近开始抛出异常。在大多数调试情况下,我会在该方法顶部设置断点,并运行到我感兴趣的带有触发异常的参数值的调用位置。但在这种情况下,那将是不切实际的,所以我尝试设置一个条件断点,只有当该参数值出现时才会中断。我在下面指示的位置创建了一个断点,并给它一个条件str == "OffendingValue"
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断点条件行为吗?我能够正常地使用Hit Count条件。
3个回答

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)
        {
                ...
        }
    }
}

2
如果你知道有什么问题数值,那么你可以为该方法编写单元测试并通过调试来解决问题。如果不确定问题在哪里,但知道异常类型,你可以设置调试器在抛出该异常时停止。进入调试器->异常(Debug | Exceptions),勾选相应异常的Thrown选项即可。

这个方法是在一个长序列的操作中调用的,深入到了调用栈中。我之前没想过独立为这个方法编写单元测试,但也许这是一个好的方法。最简便的方法是使用一个有效的条件断点,这就是为什么我对VS为什么不能正常工作如此好奇的原因。 - Chris
我也发现了一些问题,当VS的调试功能被多次触发时,它们会出现问题。我认为这是因为VS在进行评估时落后了。因此需要采取解决方法 ;) - Rob Prouse

0

我想知道你是否遇到了堆栈溢出的问题。Visual Studio是否跟踪str的所有值或与Bar每个状态有关的任何内容?如果是这样,那么成千上万的副本可能会累加。

我想知道是否可以通过使用全局变量而不是函数内部变量来消除该问题的监控。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接