无法在 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 最终调用相同的方法但等待异步任务,所以我的假设是它可能会阻止其他任务。
将我以前非常稳定的 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 最终调用相同的方法但等待异步任务,所以我的假设是它可能会阻止其他任务。