.net ocre 程序崩溃自动dump在多平台中的实现
前言
经常排查问题的朋友都知道,我们在遇到CPU或者内存高的时候,有时会生成dump文件来做分析。但是我们也会遇到一些场景,应用程序直接崩溃退出,这个时候我们已经没法使用常规方式dump了,因为整个进程树已经退出了,那么我们有没有办法让系统自动做dump,答案是肯定的:让系统在程序崩溃时自动创建Dump。
无论是 .net framework还是 .net core 项目,都支持应用程序崩溃时生成转储,本篇我们重点看下 .net core应用在docker、macOS(lunix类似)环境下是如何实现的。
配置
设置一些变量参数:
- COMPlus_DbgEnableMiniDump 或 DOTNET_DbgEnableMiniDump: 如果设置为 1,则发生故障时启用CoreDump生成。默认值为:0
- COMPlus_DbgMiniDumpType 或 DOTNET_DbgMiniDumpType: 要收集的转储类型。 有关详细信息,请看下文的说明。默认值为:2
- COMPlus_DbgMiniDumpName 或 DOTNET_DbgMiniDumpName: 写入转储的文件路径。 确保运行 dotnet 进程的用户具有指定目录的写入权限。默认值为:/tmp/coredump.
- COMPlus_CreateDumpDiagnostics 或 DOTNET_CreateDumpDiagnostics: 如果设置为 1,则启用转储进程的诊断日志记录。默认值为:0
- COMPlus_EnableCrashReport 或 DOTNET_EnableCrashReport:(需要 .NET 6 或更高版本,目前仅Linux和MacOS可用)如果设为 1,运行时会生成 JSON 格式的故障报表,其中包括有关故障应用程序的线程和堆栈帧的信息。 故障报表名称是追加了 .crashreport.json 的转储路径/名称。
- COMPlus_CreateDumpVerboseDiagnostics 或 DOTNET_CreateDumpVerboseDiagnostics:(需要 .NET 7 或更高版本)如果设为 1,则启用转储进程的详细诊断日志记录。
- COMPlus_CreateDumpLogToFile 或 DOTNET_CreateDumpLogToFile:(需要 .NET 7 或更高版本)应写入诊断消息的文件路径。 如果未设置,则将诊断消息写入故障应用程序的控制台。
对于这些环境变量,.NET 7 标准化前缀 DOTNET_,而不是 COMPlus_。 但是,COMPlus_ 前缀仍将继续正常工作。 如果使用的是早期版本的 .NET 运行时,则环境变量仍应该使用 COMPlus_ 前缀。
关于DOTNET_DbgMiniDumpType的说明如下所示:
1: Mini 小型Dump,其中包含模块列表、线程列表、异常信息和所有堆栈。
2: Heap 大型且相对全面的Dump,其中包含模块列表、线程列表、所有堆栈、异常信息、句柄信息和除映射图像以外的所有内存。
3: Triage 与 Mini 相同,但会删除个人用户信息,如路径和密码。
4: Full 最大的转储,包含所有内存(包括模块映像)。
一般情况下,我们会配置下面的环境变量:
DOTNET_DbgEnableMiniDump = 1
DOTNET_DbgMiniDumpName = [有权限的Path目录]
DOTNET_CreateDumpDiagnostics = 1
DOTNET_EnableCrashReport = 1
用一段代码试试
由于笔者所使用的是 .net 6.0,所以这里我们先在程序启动的时候打印出前缀为COMPlus_的环境变量的值。(这一段不要省,因为很多时候,你以为设置了环境变量,但是其实没生效。)
foreach (DictionaryEntry environmentVariable in Environment.GetEnvironmentVariables())
{
if (environmentVariable.Key.ToString()?.StartsWith("COMPlus") == true)
{
Console.WriteLine($"{environmentVariable.Key}={environmentVariable.Value}");
}
}
然后我们在Thread中抛出一个异常,这会导致应用程序退出或者容器退出。
public static void Bar()
{
var thread = new Thread(() => throw new Exception("Crash"));
thread.Start();
}
配置
macOS
注意:.net5 开始才支持macOS的dump。
可以在powershell中执行命令用于测试,注意这种方式设置的环境变量仅限于当前会话中有效,设置完成后启动你的应用即可。
$env:DOTNET_DbgEnableMiniDump = 1
$env:DOTNET_DbgMiniDumpType = 4
$env:DOTNET_CreateDumpDiagnostics = 1
$env:DOTNET_EnableCrashReport = 1
$env:DOTNET_DbgMiniDumpName = "有权限的路径"
docker
容器部署,需要做以下几点:
- dockerfile中添加环境变量。
- 需要一个有写入权限的目录
- docker 容器中的核心转储生成需要 ptrace 功能(--cap-add=SYS_PTRACE 或 --privileged)
docker中需要把目录挂载到宿主机,否则容器退出,dump文件也会删除。
下方是一个dockerfile示例,以作参考。
FROM mcr.microsoft.com/dotnet/aspnet:6.0
COPY . /publish
WORKDIR /publish
EXPOSE 5100
ENV ASPNETCORE_URLS http://*:5100
# 设置环境变量
ENV COMPlus_DbgEnableMiniDump=1
ENV COMPlus_CreateDumpDiagnostics=1
ENV COMPlus_DbgMiniDumpType=4
ENV COMPlus_DbgMiniDumpName=/publish/dump/dumptest.dmp
ENV COMPlus_EnableCrashReport=1
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
# 创建文件夹组给权限
RUN mkdir -p /publish/dump/ && chmod 777 /publish/dump/
CMD ["dotnet", "WebApplication7.dll"]
在创建容器时,带参数--cap-add=SYS_PTRACE使我们容器拥有相应的权限
sudo docker run --cap-add=SYS_PTRACE -d --name apitest -p 5101:5100 apitest\:v1
运行
使用docker的方式启动应用程序后,在下图中显示了环境变量的值,这说明设置是成功的。

接下来调用我们抛异常的api后,就会看到容器虽然退出了,但是dump的还是产生了,我们也可以在文件中查看生成的dump文件。


注意事项
如果你在测试的过程没有成功,检测下环境变量和所使用的版本是否对应。
参与文献
- https://www.cnblogs.com/InCerry/p/how_to_automic_create_dump_when_app_crash.html
- https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md#configurationpolicy
.net ocre 程序崩溃自动dump在多平台中的实现的更多相关文章
- c++ 程序崩溃生成Dump文件
#include "Windows.h"#include "DbgHelp.h" int GenerateMiniDump(PEXCEPTION_POINTER ...
- windows程序崩溃生成dump文件
第一种: 通过任务管理器:这种适用在程序挂了(crash)的时候进程还未退出,比如我运行程序,出现了下面的错: 此时打开任务管理器,右击相应进程,点击"Create Dump File“: ...
- 如何在.NET程序崩溃时自动创建Dump?
今天在浏览张队转载文章的留言时,遇到一个读者问了这样的问题,如下图所示: 首先能明确的一点是"程序崩溃退出了是不能用常规的方式dump的",因为整个进程树都已经退出.现场已经无法使 ...
- .NET程序崩溃了怎么抓 Dump ? 我总结了三种方案
一:背景 1. 讲故事 最近几天接到了几个crash的求助,可能这几个朋友没玩过怎么去生成dump,只能手把手教,感觉也不是一个办法,所以有必要总结一下,后续再有朋友咨询的话,我就可以把这篇文章丢过去 ...
- WinDbg抓取程序报错dump文件的方法
程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...
- 转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案
原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...
- Android 应用程序崩溃日志捕捉
程序崩溃是应用迭代中不可避免的问题,即使有着5年或者10年经验的程序猿也无法完全保证自己的代码没有任何的bug导致崩溃,现在有一些第三方平台可以帮助我们搜集应用程序的崩溃,比如友盟,详情如下图 虽然能 ...
- 使用SetUnhandledExceptionFilter转储程序崩溃时内存DMP .
关于程序崩溃时转储内存DMP,可以设置注册表,使程序崩溃时自动转储内存DMP,见程序崩溃时利用注册表自动转储内存DMP.本文要介绍的是使用SetUnhandledExceptionFilter函数在程 ...
- VEH帮你定位程序崩溃地址
之前朋友有一个服务端程序,总是受到一些人的恶意漏洞攻击,没有源代码,只好反汇编修复了漏洞,并且使用WinLicense加保护授权. 漏洞总不是一次可以修复完的,恶意攻击并没有停止,然后加了WL保护程序 ...
- 记一次 .NET 某医疗器械 程序崩溃分析
一:背景 1.讲故事 前段时间有位朋友在微信上找到我,说他的程序偶发性崩溃,让我帮忙看下怎么回事,上面给的压力比较大,对于这种偶发性崩溃,比较好的办法就是利用 AEDebug 在程序崩溃的时候自动抽一 ...
随机推荐
- taskiq异步分布式任务管理器 适用fastapi
taskiq 异步分布式任务管理器 https://taskiq-python.github.io/ 将 taskiq 视为 asyncio celery 实现.它使用几乎相同的模式,但它更加现代和灵 ...
- 程序与用户交互(input、print)
程序与用户交互 [1]输入(input) (1)input 输入一些内容后,按下回车键后,input函数会返回用户输入的内容 input接受的所有数据类型都是str类型 username = inpu ...
- 你应该懂的AI大模型(八)之 微调 之 增量微调
一.什么是微调 1.1.什么是微调?为什么要做微调? 模型微调(Fine-tuning)指的是将一个预训练好的模型(通常在大规模通用数据集上训练)针对特定任务或领域进行优化的过程. 那么什么是预训练好 ...
- 文献阅读 A Subdivision Scheme for Hexahedral Meshes
简介 本文提出了一种六面体体细分的方案,可以将六面体分成比较光顺的六面体.同时增加六面体的数量且不改变六面体的拓扑. 本文作者 Bajaj =.= 论文方案 主要由两个步骤组成 split & ...
- Visual Studio 现已支持新的、更简洁的解决方案文件(slnx)格式
前言 解决方案文件是 Visual Studio 中用于组织和管理多个项目的文件,其后缀通常为.sln(基于 UTF-8格式的).它充当一个容器,维护着项目之间的引用关系.构建配置以及其他设置,定义了 ...
- 基于外卖系统的RBAC实现
基于角色的访问控制(RBAC)模型实现报告 引言 在我原本开发的基于 Java 的外卖管理系统中,员工之间并没有精细化的权限控制,不同岗位的员工共享了相同的后台操作权限.为了解决这一问题,并实现系统管 ...
- SciTech-EECS-Circuits-Power-PWM 控制器: PWM 的 "三种(脉频/脉宽/组合)调制方式 和 三种采样及闭环控制方式" + 应用之 UC3842 / KA3842 电路设计 与 快速检修
SciTech-EECS-Circuits-Power-PWM 控制器: PWM 的 三种调制方式 和 三种采样及闭环控制 PWM 的 三种调制方式 "脉频(脉冲频率)调制"和&q ...
- SPI协议背景知识简介与FTDI的FT4232H配成USB to SPI(MPSSE)使用实例
MPSSE Application Example: http://ftdichip.cn/Support/SoftwareExamples/MPSSE.htm MPSSE: AN_129 FTDI ...
- 组织: 阶级: 组织+管理+授权+组织结构设计+ 角色 + 分工: individual类型: 体力+普工+文职+
组织: 阶级: 组织+管理+ 授权+资源管理+ 组织结构设计+角色 社会:教育分科+分工: individual类型: 体力: 普工:砖头, 销售文职: 上传下达,文书 专业:一招鲜,专家 管理:人精 ...
- 从WebApi迁移到Minimal API?有了这个神器,小白也能10分钟搞定!
还在纠结要不要从传统WebApi迁移到Minimal API?担心改代码改到秃头?别怕!今天给你安利一个黑科技--MiniController,让你既能享受Minimal API的轻量快速,又不用放弃 ...