.NET 应用崩溃时收集转储文件的技术指南
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
前言
当 .NET 应用程序在生产环境中崩溃时,开发人员往往需要获取应用程序崩溃时的状态信息来进行问题诊断。本文将详细介绍如何在 .NET 应用程序崩溃时自动收集转储文件(dump file),帮助开发者快速定位和解决问题。
什么是转储文件?
转储文件是应用程序在崩溃时内存状态的快照,它包含了程序崩溃时的调用堆栈、变量值、线程状态等关键信息。通过分析转储文件,开发者可以还原崩溃现场,找出导致崩溃的根本原因。
配置环境变量
在 .NET 中,可以通过设置环境变量来配置崩溃时自动收集转储文件的行为。这些环境变量有两种前缀形式:DOTNET_
(.NET 7+推荐)和传统的COMPlus_
(向后兼容)。
核心配置变量
-
启用转储收集
- 变量名:
DOTNET_DbgEnableMiniDump
- 值:设置为
1
启用 - 默认值:
0
(禁用)
- 变量名:
-
转储类型
- 变量名:
DOTNET_DbgMiniDumpType
- 可选值:
1
(Mini):基本转储,包含模块列表、线程列表、异常信息和所有堆栈2
(Heap,默认值):完整堆转储,包含除映射图像外的所有内存3
(Triage):类似Mini,但会移除敏感用户信息4
(Full):完整转储,包含所有内存
- 变量名:
-
转储文件路径
- 变量名:
DOTNET_DbgMiniDumpName
- 默认值:
/tmp/coredump.<pid>
- 注意:确保运行进程的用户对指定目录有写权限
- 变量名:
高级配置选项
-
诊断日志
DOTNET_CreateDumpDiagnostics=1
:启用转储过程的诊断日志DOTNET_CreateDumpVerboseDiagnostics=1
(.NET 7+):启用详细诊断日志DOTNET_CreateDumpLogToFile=<path>
(.NET 7+):指定诊断日志输出文件
-
崩溃报告
DOTNET_EnableCrashReport=1
(.NET 6+):生成JSON格式的崩溃报告
文件路径模板
从 .NET 5 开始,转储文件路径支持动态模板:
| 模板 | 说明 | |------|------| | %%
| 百分号字符 | | %p
| 进程ID | | %e
| 可执行文件名 | | %h
| 主机名 | | %t
| 转储时间(Unix时间戳) |
示例:/tmp/coredump_%e_%t.dmp
会生成类似 /tmp/coredump_myapp_1651234567.dmp
的文件名
转储类型详解
-
Mini转储
- 体积最小
- 包含基本信息,适合快速诊断简单问题
- 不包含堆内存内容
-
Heap转储(推荐)
- 包含堆内存信息
- 可以检查对象状态和内容
- 比Full转储小,但包含大部分诊断所需信息
-
Triage转储
- 安全版本,移除敏感信息
- 适合共享给外部团队分析
-
Full转储
- 包含完整内存镜像
- 体积最大,但信息最完整
- 单文件应用和Native AOT仅支持此类型
实际应用建议
-
生产环境推荐配置
DOTNET_DbgEnableMiniDump=1 DOTNET_DbgMiniDumpType=2 DOTNET_DbgMiniDumpName=/var/dumps/app_%e_%t.dmp
-
诊断复杂问题时
DOTNET_DbgEnableMiniDump=1 DOTNET_DbgMiniDumpType=4 DOTNET_CreateDumpDiagnostics=1
-
安全注意事项
- 转储文件可能包含敏感信息
- 确保转储目录有适当权限
- 考虑使用Triage转储类型保护用户隐私
总结
通过合理配置转储收集功能,开发者可以在应用程序崩溃时自动获取关键诊断信息。建议在生产环境中至少配置Heap级别的转储收集,为后续的问题诊断保留足够的信息。同时要注意转储文件的安全存储和敏感信息的保护。
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考