4

我有一个控制台应用程序,它读取一些数据,将其填充到类似字典的结构中,对其进行操作,然后生成一些输出文件。

但是,在打印输出时,有时会打印:

Fail:

真正不应该的地方。我在 Google 上找不到任何东西(搜索量不大),当​​我在我的解决方案中搜索字符串“fail”时我找不到任何东西(所以这不是我的代码在做的)。

我不知道为什么会发生这种情况,相关块确实经常产生异常,但我捕获了它们,当我使用它Console.WriteLine而不是Trace.WriteLine它时工作正常,尽管我无法轻易验证这是原因。

我不知道如何解决这个问题。

什么可能导致Fail:打印到控制台?

我如何设置断点来停止它?

我什至从哪里开始寻找解决方案?

4

1 回答 1

2

多亏了阿德里亚诺的直觉,我能够怀疑断言是罪魁祸首。

事实上,打印神秘消息时正在运行的代码块Fail:确实调用了这样的断言:

Debug.Assert(myString.Length > 0);

显然,“Fail:”应该被理解为“Assertion fail”。我可以通过将其更改为来验证这一点:

Debug.Assert(myString.Length > 0, "Assertion failed with myString == \"" + myString + "\".");

这将Fail:消息更改为Fail: Assertion failed with myString == ""并消除了混淆,并让我处理了进一步调试的问题(因为我知道断言是生成失败消息的确切行)。

事实证明,在调试模式下,Visual Studio 不会在断言失败时中断,而是简单地将失败消息打印到输出(此处讨论了启用中断)。就我而言,我一直在使用跟踪侦听器,以便将程序的输出打印到文件以及控制台中。为此,我使用了以下初始化代码:

    private static void PrepareListeners()
    {
        Trace.Listeners.Clear();

        var logPath = "/path/to/my/file.txt";
        File.Delete(logPath);
        var textListener = new TextWriterTraceListener(logPath);

        var consoleListener = new ConsoleTraceListener(false);
        consoleListener.TraceOutputOptions = TraceOptions.DateTime;

        Trace.Listeners.Add(textListener);
        Trace.Listeners.Add(consoleListener);
        Trace.AutoFlush = true;
    }

之后我一直在用Trace.WriteLine. 跟踪侦听器似乎也在接收断言失败消息。(它们出现在我的日志文件和控制台中。)

于 2012-11-20T12:10:52.397 回答