无法在3.1 docker容器中运行dotnet转储-“;进程1未运行兼容的.NET核心运行时“;

无法在3.1 docker容器中运行dotnet转储-“;进程1未运行兼容的.NET核心运行时“;,docker,asp.net-core,.net-core,ubuntu-18.04,Docker,Asp.net Core,.net Core,Ubuntu 18.04,在将我以前非常稳定的dotnet core应用程序从2.0升级到3.1后,它开始出现内存泄漏。我试图抓取一个内核转储来分析什么在使用所有内存,但在尝试这样做时遇到了多个绊脚石 我的应用程序运行在docker容器中,基于mcr.microsoft.com/dotnet/core/sdk:3.1进行构建,基于mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic进行运行 出于调试目的,我正在使用mcr.microsoft.com/dotnet/core/sdk

在将我以前非常稳定的dotnet core应用程序从2.0升级到3.1后,它开始出现内存泄漏。我试图抓取一个内核转储来分析什么在使用所有内存,但在尝试这样做时遇到了多个绊脚石

我的应用程序运行在docker容器中,基于mcr.microsoft.com/dotnet/core/sdk:3.1进行构建,基于mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic进行运行

出于调试目的,我正在使用mcr.microsoft.com/dotnet/core/sdk:3.1-bionic,然后安装所需的工具:

dotnet tool install -g dotnet-dump
dotnet tool install -g dotnet-counters
dotnet tool install -g dotnet-trace
当我尝试运行dotnet trace获取pid时,每次都会返回不同的pid:

root@499333cca890:/app# dotnet trace ps
      1290 dotnet     /usr/share/dotnet/dotnet

root@499333cca890:/app# dotnet trace ps
      1311 dotnet     /usr/share/dotnet/dotnet

root@499333cca890:/app# dotnet trace ps
      1332 dotnet     /usr/share/dotnet/dotnet
那可能是跟踪本身,它没有拾取我的应用程序?ps aux报告的pid为1(我假设这是docker事件):

如果我试图通过dotnet core dump collect-p 1获取一个核心转储,我会得到以下结果:

Process 1 not running compatible .NET Core runtime.
以下是dotnet的输出信息:

以下是我的csproj中的目标框架:

<TargetFramework>netcoreapp3.1</TargetFramework>

这些选项是我最后的发现,我认为它们将是解决方案,但仍然没有运气。我假设我错过了其他的东西?除此之外,它只是一个运行在最新3.1 sdk中的3.1应用程序,因此我无法理解为什么会出现问题。

通过逐行比较我的应用程序与一个新的dotnet web应用程序项目,该项目没有显示相同的行为,我发现原因是我的Program.cs Main()方法中的这一行:

将其更改为以下内容可以解决访问诊断时的问题以及我遇到的内存问题:

CreateHostBuilder(args).Build().Run()

这是一个新的dotnet核心web应用程序项目中的默认设置,因此不确定从何处开始使用.Start()。区别似乎在于Run是异步的,Start最终调用相同的方法,但等待异步任务,因此我的假设是它可能会阻止其他任务。

此处有完整的讨论和解释:
<TargetFramework>netcoreapp3.1</TargetFramework>
 docker run -d --privileged --cap-add SYS_PTRACE [...]
CreateHostBuilder(args).Start()
CreateHostBuilder(args).Build().Run()