乐趣区

关于程序员:Rider调试ASPNET-Core时报thread-not-gcsafe的解决方法

  新建了一个 ASP.NET Core 5.0 的 Web API 我的项目,当应用断点调试 Host.CreateDefaultBuilder(args) 时,进入该函数后查看两头变量的值,报错 Evaluation is not allowed: The thread is not at a GC-safe point。在群里问了也没人回应,可能没有遇到过这个问题吧。

一. 解决问题的过程

1.Visual Studio 2022 调试

  首先想到的是可能 Rider 不行,换成 Visual Studio 2022 试试,所以就查到了文献 [1],发现须要 pdb 文件,还须要设置符号什么的,感觉太麻烦了。

2.Rider 调试

  而后又换成了 Rider,既然调试看不到两头变量的值,那就间接 Console.WriteLine() 进去,后果 Console 在以后上下文中基本就不存在,如下:

二. 最终的解决办法

1.YouTrack 上的解决办法

  持续在网上查找,发现在 JetBrains 的官网 YouTrack 上 2,Evgeny Terekhin 在 2022 年 5 月 30 日给出了一个解决办法:

SET COMPLUS_ZapDisable=1    NGen off (CLR)
SET COMPLUS_JitMinOpts=1    Disable as much JIT optimizations as possible (CoreCLR)
SET COMPlus_TieredCompilation=0    No tiered JIT, only do one pass (CoreCLR)
SET COMPLUS_ReadyToRun=0    Don't do netcore's analog to NGen (CoreCLR)

大略的意思是对 CLR 做了设置,先不论设置的什么了,抱着试试看的心态。配置 launchSettings.json 文件:

"environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development",
    "COMPLUS_ZapDisable": "1",
    "COMPLUS_JitMinOpts": "1",
    "COMPlus_TieredCompilation": "0",
    "COMPLUS_ReadyToRun": "0"
}

实现的配置文件如下所示:

2. 调试 ASP.NET Core

  打上断点启动调试后,神奇般的发现也能够查看两头变量了。如下:

Rider 调试源码还是比 Visual Studio 不便很多,不须要 pdb 文件,也不须要设置什么符号,只须要进入要调试的函数中打上断点,而后启动调试即可。

参考文献:
[1]Debugging External Sources with Visual Studio:https://devblogs.microsoft.co…
[2]Debugger: Evaluation is not allowed: The thread is not at a GC-safe point:https://youtrack.jetbrains.co…
[3]When debugging, variables don’t display all of their data, instead we get ‘Evaluation is not allowed: The thread is not at a GC-safe point’:https://youtrack.jetbrains.co…

本文由 mdnice 多平台公布

退出移动版