一:背景
- 讲故事
前几天微信上有位朋友找到我,说他程序的 线程数 会偶发性瞬时飙高,让我看下大概是什么原因,截图如下:
如果这种问题每天都会出现,比较好的做法就是用 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
#include
#include
#include "Dbghelp.h"
#pragma comment(lib, "dbghelp.lib")
int main()
{
//1. 创建文件
HANDLE hFile = CreateFile(L"D:testdumpMiniDump.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 包。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
1 什么是适配器设计模式 适配器设计模式是一种结构性设计模式,用于在不兼容的接口之间进行转换。它允许将一个类的接口转换成客户端所期望的接口。 适配器模式包含以下几个角色: 目标接口(Target):定义客户端所期望的接口。 适配器(Adapter):实现目标接…