2

我正在运行一个 C# 控制台应用程序,例如如下:

int sum=0;
for (i=1;i<100000000;i++)
{
    sum+=getSomeAlmostRandomValue();
    // if (i%10000==0)
    // Console.WriteLine(sum/i);
}

简而言之,我想检查大量迭代结果的平均值。

有时,我想检查到目前为止的平均值,看看它是如何进行的......但是在迭代中每次检查 IF 条件可能太愚蠢/太耗时了。(这只是介绍我的问题的一个例子。我知道我可以将 for 循环分成 2 个嵌套的 for 循环,以便没有 IF。但是,也许我不想在每次迭代时都写入 WriteLine)。所以我真正的问题是:

有没有办法(通过删除2个注释行)随意暂停程序并检查我的变量的值(i,sum)

4

5 回答 5

5

条件断点是你的选择。

右键单击断点,在那里设置条件。另请参阅此处的MSDN 博客

在此处输入图像描述 在此处输入图像描述

于 2013-09-23T09:39:28.843 回答
1

只需使用条件断点并调试应用程序。例如,您的模数逻辑可以用作断点条件:

i % 10000 == 0

每 10,000 次迭代就会达到断点。

于 2013-09-23T09:39:26.160 回答
0

对于可以断言正确值的单元测试来说,这看起来已经成熟了,完全不需要定期手动检查,但我无法帮助你,因为我不知道这是要做什么。

在这个特定示例中,我将在 IDE 中使用条件断点。

但是,如果您想在代码中执行此操作,则可以使用System.Diagnostics.Debugger类、Break()方法进行中断。

类中还有一些有用的方法System.Diagnostics.Debug,例如Assert, Fail,WriteLineIf等。

它看起来像这样:

int sum=0;
for (i=1;i<100000000;i++)
{
    sum+=getSomeAlmostRandomValue();

    if (i%10000==0)
        System.Diagnostics.Debugger.Break();
}

问题Debugger.Break在于它将编译成发布代码,而大多数(如果不是全部)Debug类方法都取决于DEBUG编译器符号。可以使用您自己的条件代码来回避这个问题:

#if DEBUG
    Debugger.Break();
#endif

但是,一旦调试会话完成,我倾向于避免将此代码留在代码库中。也就是说,有时您会发现在一些麻烦的遗留代码周围留下一些调试基础设施将来会派上用场。

于 2013-09-23T09:43:06.303 回答
0

谢谢大家的答案,

你让我检查调试选项,我找到了我需要的东西。

解决我的问题的是“Break All”按钮。当我按下它时,程序会暂停,我可以将鼠标悬停在变量上并检查它们的值。

但是我使用的是 C# Express 2010,并且我的工具栏上没有“Break All”。所以这就是我启用它的方式:

Tools -> Customize -> Commands -> Toolbar -> Debug -> Add Command -> Debug -> Break All
于 2013-09-23T09:49:16.267 回答
-1

如果这是一个您不在开发环境中的应用程序,您应该研究生产者-消费者模式。有了它,您可以暂停应用程序,同时确保数据在显示之前完全生成。

于 2013-09-23T09:45:22.947 回答