无法在 3.1 docker 容器中 运行 dotnet 转储 - "Process 1 not running compatible .NET Core runtime"

Unable to run dotnet dump in 3.1 docker container - "Process 1 not running compatible .NET Core runtime"

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

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

出于调试目的,我使用 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 时,它 returns 每次都是不同的 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 的东西):

root@499333cca890:/app# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.4  7.7 21890008 158932 ?     Ssl  05:52   1:14 dotnet MyApp.dll

如果我尝试通过 dotnet core dump collect -p 1 进行核心转储,我会得到以下信息:

Process 1 not running compatible .NET Core runtime.

这是 dotnet --info 的输出:

.NET Core SDK (reflecting any global.json):
 Version:   3.1.302
 Commit:    41faccf259

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  18.04
 OS Platform: Linux
 RID:         ubuntu.18.04-x64
 Base Path:   /usr/share/dotnet/sdk/3.1.302/

Host (useful for support):
  Version: 3.1.6
  Commit:  3acd9b0cd1

.NET Core SDKs installed:
  3.1.302 [/usr/share/dotnet/sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.App 3.1.6 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.6 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

这是我的 csproj 的目标框架:

<TargetFramework>netcoreapp3.1</TargetFramework>

我在本地 运行宁 macos 作为 docker 主机并设置特权并启用 SYS_PTRACE:

 docker run -d --privileged --cap-add SYS_PTRACE [...]

这些选项是我最后的发现,我认为它们会是解决方案,但仍然没有成功。我假设它是我遗漏的其他东西?除此之外,它只是一个 3.1 应用程序 运行 在最新的 3.1 sdk 中,所以我不明白为什么那里会出现问题。

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

CreateHostBuilder(args).Start()

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

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

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