英文:
dotnet-gcdump error : Process 1 not running compatible .NET runtime
问题
I'm here to help with the translation:
我有一个在 Tanzu Kubernetes 环境中运行的 .Net 7 API 作为后台服务。我已经安装了 dotnet-gcdump,但是当我尝试执行转储(在进入 pod 后)时,使用:
./dotnet-gcdump collect -p 1 -o sample1
我得到一个错误:
0.0s: 创建类型表刷新任务
0.0s: [错误] gcdump 过程中出现异常: Microsoft.Diagnostics.NETCore.Client.ServerNotAvailableException: 进程 1 未运行兼容的 .NET 运行时。
位置: Microsoft.Diagnostics.NETCore.Client.PidIpcEndpoint.GetDefaultAddress() 在 /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcTransport.cs:第 282 行
位置: Microsoft.Diagnostics.NETCore.Client.PidIpcEndpoint.Connect(TimeSpan timeout) 在 /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcTransport.cs:第 243 行
位置: Microsoft.Diagnostics.NETCore.Client.IpcClient.SendMessageGetContinuation(IpcEndpoint endpoint, IpcMessage message) 在 /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs:第 40 行
位置: Microsoft.Diagnostics.NETCore.Client.EventPipeSession.Start(IpcEndpoint endpoint, IEnumerable`1 providers, Boolean requestRundown, Int32 circularBufferMB) 在 /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSession.cs:第 34 行
位置: Microsoft.Diagnostics.NETCore.Client.DiagnosticsClient.StartEventPipeSession(IEnumerable`1 providers, Boolean requestRundown, Int32 circularBufferMB) 在 /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClient.cs:第 70 行
位置: Microsoft.Diagnostics.Tools.GCDump.EventPipeSessionController..ctor(Int32 pid, List`1 providers, Boolean requestRundown) 在 /_/src/Tools/dotnet-gcdump/DotNetHeapDump/EventPipeDotNetHeapDumper.cs:第 235 行
位置: Microsoft.Diagnostics.Tools.GCDump.EventPipeDotNetHeapDumper.DumpFromEventPipe(CancellationToken ct, Int32 processID, MemoryGraph memoryGraph, TextWriter log, Int32 timeout, DotNetHeapInfo dotNetInfo) 在 /_/src/Tools/dotnet-gcdump/DotNetHeapDump/EventPipeDotNetHeapDumper.cs:第 52 行
API 的 Dockerfile 在 Gitlab CI 中动态生成,使用以下脚本:
.generate_dockerfile:
script: |
echo "检查 Dockerfile 是否存在"
if ! [ -e Dockerfile ]; then
echo "Dockerfile 不存在。尝试从 csproj 创建新的 Dockerfile。"
pwd
cd ./src
echo "$PWD"
docker_entrypoint=$(grep -m 1 AssemblyName $PWD/*.csproj | sed -r 's/\s*<[^>]*>//g' | sed -r 's/\r$//g').dll
echo "${docker_entrypoint}"
cat > Dockerfile << EOF
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
RUN apt-get update && apt-get install -y wget
RUN wget -O sdk_install.sh https://dot.net/v1/dotnet-install.sh
RUN chmod 777 sdk_install.sh
RUN ./sdk_install.sh -c 7.0
RUN cd /root/.dotnet
RUN /root/.dotnet/dotnet tool install --global dotnet-gcdump
RUN echo $PATH
RUN export ENV PATH="$PATH:/root/.dotnet/tools"
RUN echo $PATH
WORKDIR /app
COPY ./publish .
ENTRYPOINT dotnet $docker_entrypoint
EOF
echo "创建 Dockerfile"
else
echo "Dockerfile 存在"
fi
当我运行 `./dotnet-gcdump --version` 时,得到:
7.0.410101+f9938321xxxxxxxxxxxxxxxxxxxxxxxxxxxx
当我运行 `./dotnet --info` 时,得到:
.NET SDK:
版本: 7.0.202
提交: 6c74320bc3
运行时环境:
操作系统: debian
操作系统版本: 11
操作系统平台: Linux
RID: debian.11-x64
基础路径: /root/.dotnet/sdk/7.0.202/
主机:
版本: 7.0.4
架构: x64
提交: 0a396acafe
安装的 .NET SDK:
7.0.202 [/root/.dotnet/sdk]
安装的 .NET 运行时:
Microsoft.AspNetCore.App 7.0.4 [/root/.dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 7.0.4 [/root/.dotnet/shared/Microsoft.NETCore.App]
找到的其他架构:
无
环境变量:
未设置
global.json 文件:
未找到
我遗漏了什么?
Please let me know if there's anything else you need!
英文:
I have a .Net 7 API thats runs as a background service and it is running on tanzu kubernetes environment. I have installed dotnet-gcdump but when I try to execute a dump (after exec into pod) using :
./dotnet-gcdump collect -p 1 -o sample1
I am getting an error :
0.0s: Creating type table flushing task
0.0s: [Error] Exception during gcdump: Microsoft.Diagnostics.NETCore.Client.ServerNotAvailableException: Process 1 not running compatible .NET runtime.
at Microsoft.Diagnostics.NETCore.Client.PidIpcEndpoint.GetDefaultAddress() in /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcTransport.cs:line 282
at Microsoft.Diagnostics.NETCore.Client.PidIpcEndpoint.Connect(TimeSpan timeout) in /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcTransport.cs:line 243
at Microsoft.Diagnostics.NETCore.Client.IpcClient.SendMessageGetContinuation(IpcEndpoint endpoint, IpcMessage message) in /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcClient.cs:line 40
at Microsoft.Diagnostics.NETCore.Client.EventPipeSession.Start(IpcEndpoint endpoint, IEnumerable`1 providers, Boolean requestRundown, Int32 circularBufferMB) in /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/EventPipeSession.cs:line 34
at Microsoft.Diagnostics.NETCore.Client.DiagnosticsClient.StartEventPipeSession(IEnumerable`1 providers, Boolean requestRundown, Int32 circularBufferMB) in /_/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsClient/DiagnosticsClient.cs:line 70
at Microsoft.Diagnostics.Tools.GCDump.EventPipeSessionController..ctor(Int32 pid, List`1 providers, Boolean requestRundown) in /_/src/Tools/dotnet-gcdump/DotNetHeapDump/EventPipeDotNetHeapDumper.cs:line 235
at Microsoft.Diagnostics.Tools.GCDump.EventPipeDotNetHeapDumper.DumpFromEventPipe(CancellationToken ct, Int32 processID, MemoryGraph memoryGraph, TextWriter log, Int32 timeout, DotNetHeapInfo dotNetInfo) in /_/src/Tools/dotnet-gcdump/DotNetHeapDump/EventPipeDotNetHeapDumper.cs:line 52
The Dockerfile for the API is generated dynamically in Gitlab CI using the following script :
.generate_dockerfile:
script: |
echo "checking dockerfile existence"
if ! [ -e Dockerfile ]; then
echo "dockerfile doesn't exist. Trying to create a new dockerfile from csproj."
pwd
cd ./src
echo "$PWD"
docker_entrypoint=$(grep -m 1 AssemblyName $PWD/*.csproj | sed -r 's/\s*<[^>]*>//g' | sed -r 's/\r$//g').dll
echo "${docker_entrypoint}"
cat > Dockerfile << EOF
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
RUN apt-get update && apt-get install -y wget
RUN wget -O sdk_install.sh https://dot.net/v1/dotnet-install.sh
RUN chmod 777 sdk_install.sh
RUN ./sdk_install.sh -c 7.0
RUN cd /root/.dotnet
RUN /root/.dotnet/dotnet tool install --global dotnet-gcdump
RUN echo $PATH
RUN export ENV PATH="$PATH:/root/.dotnet/tools"
RUN echo $PATH
WORKDIR /app
COPY ./publish .
ENTRYPOINT dotnet $docker_entrypoint
EOF
echo "dockerfile created"
else
echo "dockerfile exists"
fi
When I run ./dotnet-gcdump --version
I get :
7.0.410101+f9938321xxxxxxxxxxxxxxxxxxxxxxxxxxxx
And when I run ./dotnet --info
I get :
.NET SDK:
Version: 7.0.202
Commit: 6c74320bc3
Runtime Environment:
OS Name: debian
OS Version: 11
OS Platform: Linux
RID: debian.11-x64
Base Path: /root/.dotnet/sdk/7.0.202/
Host:
Version: 7.0.4
Architecture: x64
Commit: 0a396acafe
.NET SDKs installed:
7.0.202 [/root/.dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 7.0.4 [/root/.dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 7.0.4 [/root/.dotnet/shared/Microsoft.NETCore.App]
Other architectures found:
None
Environment variables:
Not set
global.json file:
Not found
What am I missing ?
答案1
得分: 0
问题出在进程ID上 - 我传递了一个错误的进程ID。
在运行转储之前,您必须检查dotnet DLL(主进程)的进程ID:
cd /root/.dotnet/tools
./dotnet-gcdump ps
./dotnet-gcdump ps列出了容器中运行的所有进程,以及它们对应的ID,就像下面示例输出中的一样:
./dotnet-gcdump ps
6 dotnet /usr/share/dotnet/dotnet dotnet MyAPP.Core.MyAPI.dll
英文:
The issue was with the process ID - i was passing in a wrong process ID.
You have to check the process ID of the dotnet DLL (main process) before running the dump with :
cd /root/.dotnet/tools
./dotnet-gcdump ps
./dotnet-gcdump ps lists all the processes running in the container , with their corresponding ID like in the example output below:
./dotnet-gcdump ps
6 dotnet /usr/share/dotnet/dotnet dotnet MyAPP.Core.MyAPI.dll
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论