我可以在附加调试器的DEBUG中避免慢速.net异常吗?

JJS*_*JJS 9 .net debugging exception-handling exception visual-studio

我可以运行一个在调试器中大量使用异常的程序而不是在调试器中捕获异常吗?

具体来说,我正在尝试使用TSQL ScriptDOM解析器,我知道在调试模式下使用ANTLR很慢.

如果您查看调试输出并不奇怪,您会发现这是由Microsoft®SQLServer®2012Transact-SQL ScriptDom解析器引起的,因为它基于ANTLR框架,它使用异常展开AST生成,这就是它在调试器内部运行时变慢的原因.

我完全理解.net异常在抛出时很慢

在使用标准DEBUG配置运行时,如何连接调试器,我怎样才能避免缓慢?

  • 我已经禁用了intellitrace.
  • 我没有定义DEBUG常量.
  • 我在工具>选项>调试>输出窗口中关闭了异常消息.

我还能尝试什么?

  • 我可以通过app.config更改CLR设置吗?
  • 在Visual Studio中更改的选项?

这是我用于解析的特定代码.

TSqlParser parser = new TSql110Parser(false);
IList<ParseError> errors;
TSqlFragment fragment = parser.Parse(new StringReader(sqltext), out errors);
Run Code Online (Sandbox Code Playgroud)

当使用CTRL + F5运行时,它快速完成,并使用F5(附带调试器),我放弃等待.

Sco*_*ain 7

一个可能的解决方法,你可以做(我跑了一个类似的问题,即一个图像处理库将抛出一个OutOfMemoryException调用的第三方库的代码和分离前,如果用在调试器附着在一个特别大的数据集)放在一个断点在断点重新附加调试器后,调试器Debugger.Launch().

#if DEBUG
bool debuggerAttached = Debugger.IsAttached;
if(debuggerAttached)
{
    Debugger.Break(); //Detach the debugger to make the next section faster.
}
#endif

TSqlParser parser = new TSql110Parser(false);
IList<ParseError> errors;
TSqlFragment fragment = parser.Parse(new StringReader(sqltext), out errors);

#if DEBUG
if(debuggerAttached && !Debugger.IsAttached)
{
    Debugger.Launch();
}
#endif
Run Code Online (Sandbox Code Playgroud)


Ed *_*ott 4

您无法停止异常,并且当进程暂停时,第一次机会异常在调试器下速度很慢,操作将转移到调试器以说明它是否想了解它,然后再次重新启动客户端(直到下一个)。恐怕这就是 Win32 Debug Api 的工作原理。

我对 ScriptDom 进行了大量调试,最好的结果是解析格式良好且有效的小脚本。

我尝试将脚本限制为仅存在问题的部分。

编辑

  • 另外,值得注意的是,他们使用 DebuggerNonUserCode 在 VS2015 中使这种情况变得更好 - http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/performance-improvement-when-debugging-net-code-with -视觉工作室-2015.aspx (2认同)