2016-10-20 48 views
1

當我在我的解決方案中運行所有測試(約800次測試)時,經過一段時間後,出現一個帶有錯誤的彈出窗口,顯示vstest.executionengine.x86.exe已停止工作。vstest在運行某些特定測試時崩潰

的問題,一些細節的例子,我得到的是在這裏:

Problem signature: 
    Problem Event Name: CLR20r3 
    Problem Signature 01: vstest.executionengine.x86.exe 
    Problem Signature 02: 14.0.23107.0 
    Problem Signature 03: 559b7b6c 
    Problem Signature 04: mscorlib 
    Problem Signature 05: 4.6.1076.0 
    Problem Signature 06: 56d79fa2 
    Problem Signature 07: 0 
    Problem Signature 08: ffffffff 
    Problem Signature 09: System.StackOverflowException 
    OS Version: 6.1.7601.2.1.0.256.48 
    Locale ID: 1051 
    Additional Information 1: 5cd2 
    Additional Information 2: 5cd2742c12da7dd4b1d5bf900186a452 
    Additional Information 3: 2fe2 
    Additional Information 4: 2fe276cacf1c00cd7a2aed7b27f5a5f9 

Problem signature: 
    Problem Event Name: APPCRASH 
    Application Name: vstest.executionengine.x86.exe 
    Application Version: 14.0.23107.0 
    Application Timestamp: 559b7b6c 
    Fault Module Name: clr.dll 
    Fault Module Version: 4.6.1076.0 
    Fault Module Timestamp: 56d7a0ff 
    Exception Code: c00000fd 
    Exception Offset: 00003567 
    OS Version: 6.1.7601.2.1.0.256.48 
    Locale ID: 1051 
    Additional Information 1: 0127 
    Additional Information 2: 01273c850b3b6fc6378d3f666887788e 
    Additional Information 3: 0786 
    Additional Information 4: 07866ddaac895bff9a7fa791fcdaa4a7 

在VS輸出窗口,我得到:

------ Run test started ------ 
The active Test Run was aborted because the execution process exited unexpectedly. To investigate further, enable local crash dumps either at the machine level or for process vstest.executionengine.x86.exe. Go to more details: http://go.microsoft.com/fwlink/?linkid=232477 
========== Run test finished: 0 run (0:03:55,0267906) ========== 

當我試圖讓本地崩潰轉儲我發現有是沒有這樣的註冊表鍵,所以我一直無法做到這一點。

我位於所有導致vstest .---。exe崩潰的測試(22個測試)中,評論它們並且再次運行所有測試並且沒有那些「錯誤」測試。一切運行良好。

這些測試有什麼問題?他們都是過去工作的舊測試。如何找到問題?

回答

5

根據我的經驗,StackoverFlowExeptions通常是由一些永不終止的遞歸方法調用引起的。嘗試調試其中的一個22測試,以確定遞歸是否是問題。

+0

你可能是對的。我詢問了我的同事關於他編輯的一種方法,並且存在可能導致vstest.exe崩潰的無限遞歸。修復後,我會看看是否只是這個問題。現在感謝。 – Gondil

1

有多種方法可以在單元測試中找到StackOverflowException的原因。

也許最簡單的一個就是運行您在Visual Studio調試器下確定的22個測試中的一個。爲此,您可以在VS Test Explorer的上下文菜單中選擇「調試選定的測試」。如果發生異常,VS將會中斷,你將能夠深入到調用堆棧中以準確找到它在方法調用循環中開始循環的地方。

此循環可能有合法的原因(如遞歸方法)或可能存在錯誤。在前者的情況下,可能(在許多其他可能性中)某些分層數據發生變化,因此單元測試現在在遞歸地分析層次結構時已達到極限。

如果您不能在VS調試器中運行單元測試,那麼您必須使用Windows任務管理器獲取崩潰vstest.executionengine.x86.exe的內存轉儲。

爲此,您首先等待Windows錯誤報告(WER)的窗口,您在問題中提到的窗口彈出。然後你打開任務管理器的正確位數 - 在你的情況下是32位。這意味着如果你有一個64位的操作系統,你必須啓動C:\Windows\SysWOW64\taskmgr.exe。如果你有一個32位的操作系統,你可以在C:\Windows\System32\taskmgr.exe上運行正常的操作系統。

然後右鍵單擊vstest.executionengine.x86.exe進程並選擇「創建轉儲文件」。生成的.dmp文件可以加載到VS或WinDbg中,其中可以使用SOS擴展分析調用堆棧。

要在VS中調試內存轉儲,您可以閱讀關於它的更多內容here

關於WinDbg,您必須下載它here,設置幾個初始配置設置here,然後使用here所述的命令列出線程及其調用堆棧。

現在你應該很容易找到你的問題的根本原因。

+0

現在我很困惑哪個答案必須標記爲ANSWER來形成我的問題。 vstest崩潰的原因是真正的深層遞歸功能。所以我認爲@Jonas發佈了答案。無論如何,你真的很好地總結了如何調試這些類似的問題。我認爲這對許多用戶會有所幫助。謝謝。 – Gondil