Dot-Net

在附加了調試器的情況下,我可以避免在 DEBUG 中出現緩慢的 .net 異常嗎?

  • May 21, 2019

我可以執行一個在調試器中大量使用異常的程序,而不是在調試器中擷取異常嗎?

具體來說,我正在嘗試使用 TSQL ScriptDOM 解析器,並且我知道它在調試模式下使用 ANTLR 很慢

如果您查看調試輸出並不奇怪,您會發現這是由 Microsoft® SQL Server® 2012 Transact-SQL ScriptDom 解析器引起的,因為這是基於 ANTLR 框架,它使用異常展開 AST 產生式,這就是它在調試器中執行時變慢的原因。

我完全理解.net 異常在拋出時很慢

使用標準 DEBUG 配置執行並附加調試器時,如何避免執行緩慢?

  • 我已經禁用了智能跟踪。
  • 我沒有定義 DEBUG 常量。
  • 我在工具 > 選項 > 調試 > 輸出視窗中關閉了異常消息。

我還能嘗試什麼?

  • 我可以通過 app.config 更改的 CLR 設置?
  • 在 Visual Studio 中更改的選項?

這是我用於解析的特定程式碼。

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

當使用 CTRL+F5 執行時,它會很快完成,並且使用 F5(附加調試器),我放棄等待。

您無法停止異常,並且由於***程序暫停,調試器下的第一次機會異常很慢,操作被轉移到調試器以說明它是否想知道它,然後再次重新啟動客戶端(直到下一個)。***恐怕這就是 Win32 Debug Api 的工作方式。

我對 ScriptDom 做了很多調試,我想出的最好的方法是解析格式良好且有效的小腳本。

我嘗試將腳本限制在有問題的部分。

您可以做的一種可能的解決方法(我遇到了一個類似的問題,OutOfMemoryException如果在調試器附加到特別大的數據集上時使用圖像處理庫會拋出一個)是在呼叫第 3 方庫程式碼並分離之前放置一個斷點調試器,在斷點後用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

引用自:https://stackoverflow.com/questions/33395204