2013-12-17 75 views
0

我正在調試偶爾拋出StackOverFlowException的屬性散佈的第三方庫。我可以防止StackOverflowException在Visual Studio中崩潰我的調試對象嗎?

每當我在Watch窗口中查看這個庫中的對象時,我最終都會收到錯誤消息「功能評估被中止」以及我正在調試崩潰的應用程序。

我寫的(試圖在監視窗口中對其進行評估時)再現這個屬性的例子:

private static int CausesStackoverflow 
    { 
     get { return CausesStackoverflow; } 
    } 

有什麼辦法,而不用擔心我的應用程序崩潰是由於評估在監視窗口屬性到一個Stackoverflow?

+0

您的意思是說您需要Watch窗口告訴您示例代碼是無限遞歸的嗎? –

+0

只是要清楚:你的簡單財產樣本並不簡單,它是破碎的。此外:StackOverflow導致應用程序被終止。你到底在期待什麼?沒有從StackOverflow恢復的正確方法。請參閱http://msdn.microsoft.com/en-us/library/system.stackoverflowexception%28v=vs.110%29.aspx – Samuel

+0

是的,我希望Watch窗口告訴我StackoverflowException是由評估的函數引起的,但不會崩潰整個應用程序。我所包含的代碼片段僅僅是一個例子,我意識到它已經被破壞了,但我不能更改我想要調試的第三方代碼。 –

回答

0

您應該阻止(使用計數器或其他技巧)而不是catch StackOverflowExceptions。

由於這是第三方代碼(所以我想這不能改變),你可以試試這個:


與2.0開始出現StackOverflow異常只能在下列情況下被抓。

  1. CLR是在宿主環境中,其中主機特別允許的StackOverflow例外處理
  2. 該計算器異常是由用戶代碼拋出,而不是由於實際的堆棧溢出情況(參考正在運行)

MSDN StackOverflowException page

在.NET框架 以前的版本,您的應用程序可以 抓一個StackOverflowException對象 (例如,從 無限遞歸恢復)。然而, 練習目前不鼓勵 ,因爲重要的附加代碼是 需要可靠地捕獲堆棧 溢出異常並繼續 程序執行。

在.NET Framework 2.0版本開始,StackOverflowException 對象不能由一個try-catch 塊捕獲和相應的過程是 默認終止。因此, 建議用戶編寫代碼 來檢測並防止堆棧溢出。例如,如果您的 應用程序依賴於遞歸,請使用 計數器或狀態條件來終止遞歸循環。注意 承載公共語言運行時(CLR)的應用程序可以指定CLR卸載發生堆棧 溢出異常的應用程序域,並讓相應的進程繼續。有關 的更多信息,請參閱 ICLRPolicyManager接口和 承載公共語言運行時。

相關問題