教你如何生成 Dump

一:背景

  1. 讲故事
    前几天微信上有位朋友找到我,说他程序的 线程数 会偶发性瞬时飙高,让我看下大概是什么原因,截图如下:
    如果这种问题每天都会出现,比较好的做法就是用 dotnet-trace 捕获 ThreadCreated 事件,但可气的是朋友说大概一个月发生次把,这种情况下用 dotnet-trace 持续监视就没必要了,弄不好把硬盘给爆掉了。

那怎么办呢?还能怎么办,借助第三方工具 来生成dump,比如 procdump,dotnet-dump 等等,但这里又有限制了,很多人不愿意在docker中再开启一个进程,希望让程序自己生成dump,这个其实能理解,很多商业化工具都具有 crash dump 的功能,比如:腾讯会议,有道字典 等等,本篇就来聊一聊如何自主生成 dump。

二:如何自主生成 dump

  1. Windows 平台上如何自主
    熟悉 Windows 平台的朋友都知道,在 Win32 API 中有一个 MiniDumpWriteDump 的方法声明,方法实现是在 dbghelp.dll中,而且 dbghelp 是操作系统自带的,有了这些知识,我们可以将 dbghelp.lib 静态链接过来生成dump,参考代码如下:

#include 
#include 
#include 
#include "Dbghelp.h"
#pragma comment(lib, "dbghelp.lib")

int main()
{
    //1. 创建文件
    HANDLE hFile = CreateFile(L"D:\\testdump\\MiniDump.dmp", GENERIC_READ | GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpWithFullMemory, NULL,
        NULL, NULL);

    CloseHandle(hFile);
}

将程序跑起来后,就会生成一个 dump 文件。

3. Linux 平台上如何自主

在 Linux 平台上确实没有找到类似 MiniDumpWriteDump 的办法,那怎么生成呢? 后来我就在想 dotnet-dump 它为什么能生成dump,沿着这个思路,找到了原来微软还有一个叫客户端诊断库的API Microsoft.Diagnostics.NETCore.Client,它可以帮助我们生成 dump 文件。
图片
原来它是微软提供的 EventPipe 收集机制,可以收集 .NET 的 ETW 和 EventSource 发生的事件,挺好用的,更多详情可以观察微软的官方文档。https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dia...有了这些基础,接下来就可以写个测试案例,从 nuget 拉一下 Microsoft.Diagnostics.NETCore.Client 包。
图片

你可能感兴趣的:(后端)