首页 > 编程语言 >.net ocre 程序崩溃自动dump在多平台中的实现

.net ocre 程序崩溃自动dump在多平台中的实现

时间:2024-10-15 09:49:33浏览次数:1  
标签:dump COMPlus ocre 转储 ENV DOTNET net 环境变量

前言

经常排查问题的朋友都知道,我们在遇到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

容器部署,需要做以下几点:

  1. dockerfile中添加环境变量。
  2. 需要一个有写入权限的目录
  3. 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

运行

  1. 使用docker的方式启动应用程序后,在下图中显示了环境变量的值,这说明设置是成功的。

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

注意事项

如果你在测试的过程没有成功,检测下环境变量和所使用的版本是否对应。

参与文献

  1. https://www.cnblogs.com/InCerry/p/how_to_automic_create_dump_when_app_crash.html
  2. https://github.com/dotnet/coreclr/blob/master/Documentation/botr/xplat-minidump-generation.md#configurationpolicy

标签:dump,COMPlus,ocre,转储,ENV,DOTNET,net,环境变量
From: https://www.cnblogs.com/chinasoft/p/18466825

相关文章

  • 4、.Net 快速开发框架:DncZeus - 开源项目研究文章
    DncZeus是一个基于ASP.NETCore和Vue.js的前后端分离的通用后台管理系统框架,其愿景是成为一个易于使用且功能丰富的.NETCore通用后台权限管理模板系统基础框架。项目名称"DncZeus"由"Dnc"(.NETCore的缩写)和"Zeus"(古希腊神话中的众神之王)组成,寓意该项目在.N......
  • 笨方法实现resnet18
    importtorchclassmyResNet(torch.nn.Module):def__init__(self,in_channels=3,num_classes=10):super(myResNet,self).__init__()#第1层self.conv0_1=torch.nn.Conv2d(in_channels,64,kernel_size=7,stride=2,padding=3)......
  • 【转】netcore 下的 C# 表达式求值
    转自:https://www.cnblogs.com/surfsky/p/12918566.html需求场景:表达式为系统功能维护,提取后,将可执行的表达式放入NetCore下if(表达式)来判定是否正确,因维护的表达式为字符串类型,例如"2>1"需要实现if(2>1){//表达式正确逻辑}else{//表达式不成立逻辑} netframewo......
  • 基于Kubernetes简易集群的部署搭建
    文章目录一、环境准备二、K8s安装和集群初始化(1)安装k8s安装工具的软件包(2)集群初始化(3)部署flannel网络插件三、使用k8s集调度运行pod四、疑惑(1).kubectlgetpods-owide-A是什么意思?(2).kubectlapply-fkube-flannel.yml是什么意思?(3).k8s中node和pod......
  • The Resistor Network Program
    Lab3:TheResistorNetworkProgramObjectivesTheobjectivesofthisassignmentareforyoutopractice:(1)theuseofC++I/Ostreams,includingerrorhandling,(2)dynamicallocationandde-allocationofone-dimensionalarrays,(3)solveaproblemusin......
  • .NET压缩zip、.NET解压zip
    参考:https://blog.csdn.net/zhaotianff/article/details/141156035usingSystem.IO.Compression;namespaceXCG.Commons{publicclassZipUtil{///<summary>///压缩zip///</summary>///<paramname="......
  • Veritas NetBackup 10.5 (Unix, Linux, Windows) - 领先的企业备份解决方案
    VeritasNetBackup10.5(Unix,Linux,Windows)-领先的企业备份解决方案The#1enterprisebackupandrecoverysolution.请访问原文链接:https://sysin.org/blog/veritas-netbackup-10/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org备份和恢复软件解决方案领......
  • Asp-Net-Core权限认证
    翻了很多的博客,文档,发现asp.netcore自带的权限认证还是比较复杂的,极少有哪篇文章把整个体系涉及到的知识点都讲清楚的,因此自己整理出了这篇文章,相当于自己的一个个人理解和总结吧关键概念认证和授权#asp.netcore中将权限认证分成了两个部分,一个是认证(Authentication),一个是......
  • QToss:基于.NET架构的跨境电商的工具,助力企业实现智能数据营销
    2024年10月13日下午参加了一场在深圳举办的跨境电商大佬们的聚会,现场参加的人数上千人。大会分享嘉宾中有位来自美国的,他告诉我们不用担心美国政府会把TikTok禁掉,TikTok在全世界都很受欢迎的。回归正题说说今天大会上发布的这个产品QtossAI选品,这是一个由.NET助力的AI驱动跨境......
  • .NET云原生应用实践(二):Sticker微服务RESTful API的实现
    本章目标完成数据访问层的基本设计实现Sticker微服务的RESTfulAPI引言:应该使用ORM框架吗?毋庸置疑,Sticker微服务需要访问数据库来管理“贴纸”(也就是“Sticker”),因此,以什么方式来存储数据,就是一个无法绕开的话题。如果你遵循领域驱动设计的思想,那么你可以说,保存到数据库的数......