我使用的方法被称为数万次,最近开始抛出异常。在大多数调试环境中,我会在此方法的顶部设置一个断点并运行直到我通过触发异常的参数值到达我感兴趣的调用。在这种情况下,这是不切实际的,所以我尝试设置一个断点,其条件只有在出现该参数值时才会中断。我在下面指出的位置创建了一个断点并给它一个条件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 debugging命令通常会破坏当前正在执行的语句上的程序执行是否为断点,当我启用了这个有问题的断点时,它根本不执行任何操作。
有没有人遇到过与Visual Studio断点条件类似的行为?我可以毫无问题地使用命中计数条件。
答案 0 :(得分: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)
{
...
}
}
}
答案 1 :(得分:2)
如果您知道有什么问题,那么您是否可以为该方法编写单元测试并以这种方式进行调试?
如果没有,如果您知道异常,则可以将调试器设置为在抛出异常时中断。转到Debug |例外和检查抛出有问题的例外。
答案 2 :(得分:0)
我想知道你是否收到了堆栈溢出。 VS是否跟踪str的所有值或任何与Bar的每个状态有关的值?如果是这样,可能会有数千份副本加起来。
我想知道你是否可以通过全局变量消除监控值的问题,而不是函数中的一个。