1

对于 tl;dr 人群:

  1. 如果代码中不是 Console.WriteLine 或 Debug.Print 语句,是什么导致类型名称写入输出窗口?它是 Visual Studio 调试器吗?和
  2. 我怎样才能关闭它?

背景和细节:

我正在尝试调试将 CSV 文件导入数据库的程序。最近,我更改了包含 3rd 方库依赖项的方式。以前,我引用的是下载的二进制文件。现在,如果第 3 方库有可用的源代码,例如 NHibernate,该项目将包含在我的解决方案中,以便与我自己编写的项目一起编译。

自更改以来,我在“输出/调试”窗口中看到很多单行,其中仅包含我以前没有看到的类型名称。我的程序是一个数据导入器,主循环导致这些行出现 1000 次,减慢调试速度并污染输出窗口。具体来说,有很多行是这样说的:

NHibernate.Driver.NHybridDataReader

我已经跟踪了代码,似乎每当 NHibernate 从数据库中读取结果时都会显示此代码。但是,该行不是 NHibernate 库在代码中输出的,因此它必须来自其他地方。我的猜测是 Visual Studio 调试器正在将其写入输出窗口,类似于程序集绑定期间发生的情况。

我尝试在发布模式下编译 NHibernate 项目,在调试模式下编译其他所有项目,但这并没有解决问题。我还尝试为 NHibernate 项目取消选中“启用 Visual Studio 托管进程”,但这也不起作用。

总之,我的问题是:

  1. 如果代码中不是 Console.WriteLine 或 Debug.Print 语句,那么将类型名称写入输出窗口是什么?和
  2. 我怎样才能关闭它?

我的问题不是什么

我的问题不是关于编写数据导入程序的更好方法,以便从数据库中预加载所需的数据。我知道我写的代码很慢;在这种特殊情况下,在生产中,没关系。我想要的是停止用大量不需要的类型信息污染调试窗口。我的程序的工作循环导致长 CSV 文件的类型被写入 1000 次,这使得输出难以使用,并且在尝试同步输出窗口时减慢了调试器的速度。就是我想要阻止的。但我不知道该怎么做,因为我什至不确定消息来自哪里。

4

2 回答 2

3

看不到代码就很难提出建议,但我要调试它是安装 RedGate 的 Reflector 的试用版,并使用它为 Debug.* 和 Console.* 函数添加断点。如果命中其中一个断点,您可以追溯调用堆栈以查找实际将行添加到输出的内容。如果这些方法都没有导致添加行,则可能向 DefaultTraceListener 和 TextWriter 添加断点。

我还没有遇到任何其他可以在运行时向 Visual Studio 输出窗口添加消息的东西。

于 2012-05-17T00:23:11.583 回答
1

我认为这无关紧要,尽管它解决了我不久前看似无关的问题(我的自动化测试随机失败并打印到控制台)。我不得不在选项的调试菜单下取消选中 Visual Studio 的“启用属性评估和其他隐式函数调用”。对不起,如果这是题外话/没有帮助!

编辑:另外,您是否尝试过更改“调试”部分中的“输出窗口”设置?您可以关闭所有调试输出并将您自己的调试打印到文件中。

于 2012-05-17T00:43:52.307 回答