【问题标题】:vstest crashed when running some particular tests运行某些特定测试时 vstest 崩溃
【发布时间】:2017-03-02 04:51:00
【问题描述】:

当我在我的解决方案中运行所有测试(大约 800 个测试)时,一段时间后会弹出一个错误窗口,显示 vstest.executionengine.x86.exe 已停止工作。

我得到的一些问题细节示例如下:

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 个测试),对它们进行了评论并再次运行所有测试,并且没有那些“错误”的测试。一切正常。

这些测试有什么问题?它们都是过去有效的旧测试。如何定位问题?

【问题讨论】:

    标签: c# testing visual-studio-2015 vstest


    【解决方案1】:

    根据我的经验,StackoverFlowExeptions 通常是由一些永不终止的递归方法调用引起的。尝试调试这 22 项测试中的一项,看看是否存在递归问题。

    【讨论】:

    • 你可能是对的。我向我的同事询问了他编辑的一种方法,并且无限递归可能导致 vstest.exe 崩溃。修复后我会看看是否只是这个问题。现在谢谢。
    【解决方案2】:

    有多种方法可以在单元测试中找到StackOverflowException 的原因。

    可能最简单的方法是运行您在 Visual Studio 调试器下确定的 22 个测试之一。为此,您在 VS 测试资源管理器的上下文菜单中选择“调试选定的测试”。如果发生异常,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所述的命令列出线程及其调用堆栈。

    现在您应该很容易找到问题的根本原因。

    【讨论】:

    • 现在我很困惑哪个答案必须标记为我的问题的答案。 vstest 崩溃的原因实际上是深度递归函数。所以我认为@Jonas 发布了答案。无论如何,您对如何调试这些类似问题进行了非常好的总结。我认为这对这里的许多用户会有帮助。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多