Visual Studio 2017调试错误:为了防止在评估函数*.toString时发生不安全的中止,所有线程都被允许运行。

41

我将Visual Studio 2017更新到了15.8.2版本。

在更新后,我在调试时遇到了以下错误:

Error Image 1

Error Image 2

Error Image 3

以下是错误信息:

Visual Studio Debug Error: 为防止在评估函数 *.toString 时出现不安全的中止,所有线程均已允许运行。这可能已更改进程的状态,并跳过了任何遇到的断点。

这个错误经常会出现,过一会儿Visual Studio就会崩溃。

我尝试卸载和重新安装Visual Studio并重置首选项,但没有成功。

当我禁用选项:“启用属性评估和其他隐式函数调用”时,当我尝试通过将鼠标移到属性上来评估它们时,会出现相同的错误。没有它进行调试相当困难,在这个版本之前我没有遇到过任何问题。

这个问题在C#和Visual Basic (.NET)中都是一样的。

这个问题有没有解决方法?我的团队在使用 Visual Studio 2017 版本 15.7.4 进行同一项目时没有出现问题。

3个回答

33

我添加了相同的错误消息,但使用不同的函数名称:

为了防止在评估函数'Microsoft.VisualStudio.Debugger.Runtime.Tracing.Refresh'时发生不安全中止,所有线程都被允许运行。这可能已经改变了进程的状态,并跳过了遇到的任何断点。


这是我摆脱这个麻烦的错误的方法:
在Visual Studio 2017中转到
工具→选项→调试→常规→勾选“使用托管兼容性模式”
感谢这篇文章:
https://www.codeart.dk/blog/2018/9/vs2017-debugger-timeout/


14
根据微软的说明 https://learn.microsoft.com/en-us/visualstudio/debugger/error-evaluating-the-function-function-timed-out-and-needed-to-be-aborted-in-an-unsafe-way?view=vs-2017,勾选此选项意味着“切换到传统调试引擎”。这可能意味着我们失去了一些新的调试功能。我想知道我们失去了什么。 - Alex Fainshtein
2
对我来说,启用这个功能会导致函数的评估超时。 - Kris
1
@AlexFainshtein 你会失去的一件事是在观察窗口和快速观察中对lambda表达式的求值。 - Tadija Bagarić
2
我不会称之为答案,因为这只是一个解决方法。使用此选项可能会导致无法正确加载您的PDB文件,从而使调试变得不可能。 - Gabrielius
4
在2019版的VS中没有这样的菜单! - user1034912
显示剩余3条评论

2
Visual Studio 2017 调试错误: 为了防止在评估 *.toString 函数时发生不安全的中止,所有线程都被允许运行。根据 this document,这个问题的一个常见原因是当调试程序评估一个属性时,只允许被检查的线程执行。因此,如果该属性正在等待应用程序内的其他线程运行,并且它正在等待一种 .NET 运行时无法中断的方式,那么就会发生这个问题。为了解决这个问题,您可以尝试以下两个可能的解决方案:解决方案#1:防止调试器调用 getter 属性;解决方案#2:使目标代码要求调试器中止对 ToString 方法的评估。此外,如果以上方法不能解决该错误,您还可以安装之前的旧版本 Visual Studio 来检查是否适用于您。

https://learn.microsoft.com/en-us/visualstudio/productinfo/installing-an-earlier-release-of-vs2017#top

希望这有所帮助。

嗨Leo,我已经尝试了解决方案1和2(请参见我的帖子)。每个类的调试都在最后一次构建中工作。是否有任何可以删除的IDE缓存? - Sorin George Budescu
@SorinGeorgeBudescu,你说的“是否有可以删除的IDE缓存?”是什么意思?你想要删除VS缓存吗?如果是,请查看:https://www.matteopozzani.com/visual-studio-cache-cleanup/。 - Leo Liu
1
@Leo Liu-MSFT,这在VS2019中让我崩溃了,而且在以前的版本中从未遇到过。您如何执行上述解决方案1或2? - buzzard51

0
在我的情况下,问题与一个包含LINQ查询的变量有关,在调试过程中在Watch窗口中进行了评估。
例如,考虑以下代码片段:
var result = query.Where(x => x.Id < 1000).ToList();

有时候,错误可能是由于调试和监视窗口对表达式的评估之间的交互引起的。通过清除监视窗口,您可能能够防止错误发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接