共计 1273 个字符,预计需要花费 4 分钟才能阅读完成。
一:背景
- 讲故事
前几天微信上有位敌人找到我,说他程序的 线程数 会偶发性刹时飙高,让我看下大略是什么起因,截图如下:
如果这种问题每天都会呈现,比拟好的做法就是用 dotnet-trace 捕捉 ThreadCreated 事件,但可气的是敌人说大略一个月产生次把,这种状况下用 dotnet-trace 继续监督就没必要了,弄不好把硬盘给爆掉了。
那怎么办呢?还能怎么办,借助第三方工具 来生成 dump,比方 procdump,dotnet-dump 等等,但这里又有限度了,很多人不违心在 docker 中再开启一个过程,心愿让程序本人生成 dump,这个其实能了解,很多商业化工具都具备 crash dump 的性能,比方:腾讯会议,有道字典 等等,本篇就来聊一聊如何自主生成 dump。
二:如何自主生成 dump
- Windows 平台上如何自主
相熟 Windows 平台的敌人都晓得,在 Win32 API 中有一个 MiniDumpWriteDump 的办法申明,办法实现是在 dbghelp.dll 中,而且 dbghelp 是操作系统自带的,有了这些常识,咱们能够将 dbghelp.lib 动态链接过去生成 dump,参考代码如下:
#include <iostream>
#include <Windows.h>
#include <minidumpapiset.h>
#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 包。
正文完