如果转储中缺少带有元数据的段,则可能出现此问题。
自内核2.6.23以来,Linux特定的/proc/[pid]/coredump_filter文件可用于控制在对应进程执行核心转储时写入哪些内存段到核心转储文件中。
请参阅core man章节“控制写入核心转储的映射”以获取更多信息。
为了获得dotNet进程的正确转储,coredump_filter应至少设置为0x3f。
您可以通过执行以下命令来检查进程的当前过滤器设置:
cat /proc/<pid>/coredump_filter
为设置适当的coredump_filter类型:
echo "0x3f" > /proc/<pid>/coredump_filter
<pid> 应该被替换为您的进程 ID,例如:
echo "0x3f" > /proc/144/coredump_filter
更新:2023年5月10日
我使用createdump
实用程序成功地收集了包含所有必要信息的完整转储:
createdump -u -f /tmp/coredump <pid>
-u
选项告诉createdump
生成完整的内存转储,包括所有内存映射文件。请注意,对于使用大量内存或具有许多内存映射文件的应用程序,这将导致非常大的转储文件。
示例:
docker container exec -it \
-u root --privileged \
<container-id> \
/usr/share/dotnet/shared/Microsoft.NETCore.App/6.0.16/createdump -u -f /tmp/coredump <pid>
docker cp <container-id>:/tmp/coredump .