当前位置: 首页 > news >正文

DotMemory系列:5. 如何实现自动化抓取和应用自托管

一:背景

1. 讲故事

前面几篇我们都是手工安装 dotmemory 软件,然后在程序的合适时机抓取snapshot,这种方式在绝大多数场景下都没有问题,但在一些精细化的场景下,如果能够实现自动化抓取,那就比较🐂👃了,这篇我们就来聊一聊这玩意。

二:如何实现自动化抓取

1. 测试代码

所谓的自动化抓取,意思就是用代码来控制 snapshot 的抓取时机,而不是你在 UI 上点来点去,为了方便测试,先上一段测试代码,参考如下:

internal class Program{static void Main(){var analyzer = new MemoryAnalyzer();analyzer.ProcessData();Console.ReadLine();}}public class MemoryAnalyzer{private readonly List<string> _data = new();public void ProcessData(){// 模拟内存密集型操作for (int i = 0; i < 10000; i++){_data.Add(new string('x', 1000));}Console.WriteLine("数据处理完成,3秒后生成快照...");Thread.Sleep(3000);MemoryProfiler.GetSnapshot("ProcessDataSnapshot");Console.WriteLine("快照已生成");}}

上面的代码非常简单,我想在 ProcessData() 方法内的某一个时点通过 MemoryProfiler.GetSnapshot 方法自动化抓取snapshot,这个让你在UI上点击,你根本无法做到。

2. dotmemory 集成交互

代码里埋好点之后,接下来打开 dotmemory,使用 Using API 模式,这样就相当于给程序开了一个口子,截图如下:

接下来点击 Start 按钮,可以看到程序自动的帮我们生成了一个叫 ProcessDataSnapshot 的snapshot,是不是挺有意思的,截图如下:

三:如何实现自托管

1. 测试代码

所谓的自托管就是让代码自己去下载 Console of DotMemory,全程不需要人为干预,最终会产生一个后缀为 *.dmw 的跟踪文件,参考代码如下:

internal class Program{static void Main(string[] args){DotMemory.Init();var config = new DotMemory.Config();config.SaveToDir(@"E:\testdump");DotMemory.Attach(config);Console.WriteLine("=== 内存分析开始 ===\n");var memoryDemo = new MemoryDemo();DotMemory.GetSnapshot("Initial");Console.WriteLine("初始快照已生成");memoryDemo.CreateObjects();DotMemory.GetSnapshot("AfterCreation");Console.WriteLine("对象创建后快照已生成");memoryDemo.Cleanup();DotMemory.GetSnapshot("AfterCleanup");Console.WriteLine("清理后快照已生成");Console.WriteLine("\n=== 分析完成 ===");DotMemory.Detach();}}public class MemoryDemo{private List<string> _strings = new();private List<byte[]> _buffers = new();private List<char[]> _charArrays = new();public void CreateObjects(){Console.WriteLine("创建对象中...");for (int i = 0; i < 500000; i++){_strings.Add($"Data_{i}_{Guid.NewGuid()}_AdditionalPaddingDataToMakeStringLarger");}for (int i = 0; i < 5000; i++){_buffers.Add(new byte[1024 * 200]);}for (int i = 0; i < 100; i++){_buffers.Add(new byte[1024 * 1024 * 5]);}for (int i = 0; i < 10000; i++){_charArrays.Add(new char[1024 * 50]);}Console.WriteLine($"已创建: {_strings.Count} 个字符串, {_buffers.Count} 个缓冲区, {_charArrays.Count} 个字符数组");}public void Cleanup(){Console.WriteLine("清理对象中...");_strings.Clear();_buffers.Clear();_charArrays.Clear();GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;GC.Collect(2, GCCollectionMode.Forced, true, true);GC.WaitForPendingFinalizers();Console.WriteLine("清理完成");}}

上面的代码会在程序运行的三个阶段抓取snapshot,将程序运行起来之后,从下图可以清晰的看到已生成三个 snapshot 快照,是不是挺有意思,截图如下:

2. Console 版 DotMemory 分析

自托管借助的是 Console 版 DotMemory,不要小看这个 Console,它可以跨平台,也可以集成到各种 自动化发布工具 里面去,这里我就简单演示下在 ubuntu 上如何用 console 版抓 .net 程序的 snapshot 到 windows 上分析。

首先到 https://www.jetbrains.com/dotmemory/download/?section=commandline 上下载安装包,截图如下:


root@ubuntu2404:/data# tar -xzvf JetBrains.dotMemory.Console.linux-x64.2025.3.0.1.tar.gzroot@ubuntu2404:/data# ps -ef | grep dotnet
root        3007    2962  0 12:13 pts/1    00:00:00 dotnet Example_6_6.dll
root        3018    1938  0 12:13 pts/0    00:00:00 grep --color=auto dotnet
root@ubuntu2404:/data# ./dotMemory.sh get-snapshot 3007 --save-to-dir=./         
dotMemory.sh is deprecated and will soon be removed: Use the dotmemory command instead.
Performs memory profiling of .NET applicationsFound 1 process(es):[3007] dotnetAttaching to [3007] dotnet runtime...
Profiler connected. PID:3007, Core CLR runtime v8.0.15.0ATTACHED. Getting snapshot...[PID:3007] Saving snapshot... ~5.6 K objects[PID:3007] SNAPSHOT #1 SAVED.[PID:3007] Processing snapshot #1...[PID:3007] SNAPSHOT #1 READY.
Profiler disconnected. PID:3007Saving workspace...
WORKSPACE SAVED
file:///data/[3007]-dotnet.2025-11-17T12-14-10.141.dmw

从上面的输出可以看到 dmw 文件已生成,接下来将文件导入到 windows 平台上,双击打开。

哈哈,是不是很完美。。。

四:总结

这个系列就先讲到这里吧,常见的功能应该都讲到了,总的来说 dotmemory 这款工具还有很多的缺点和不如意,但在专业的windbg介入之前,它起来了一个很好的拦截筛选作用。

图片名称
http://www.jsqmd.com/news/43409/

相关文章:

  • 2025年国内维保服务品牌综合实力排行榜:专业制冷技术企业深度解析
  • 2025年11月会计培训班推荐榜:权威机构课程对比与用户评价分析
  • 2025年11月成都监理公司推荐榜:专业服务对比与选择指南
  • 2025 西安红木家具热门销售厂家排行,木灵生红木领衔高端定制赛道
  • 2025年11月呼叫中心系统服务商推荐榜单:五大服务商综合对比分析
  • 2025年11月临沂美容/美容培训加盟十大热门品牌:杜氏大唐专业减肥养生稳坐头把交椅
  • 2025年11月高温链条油脂公司推荐榜单及选择指南:五大品牌综合对比分析
  • 2025 最新伺服压机厂家权威推荐榜:轴承 / 全自动 / 精密 / 四柱 / C 型 / 小型 / 装配 / 压装伺服压机厂家优选
  • 国产化Excel开发组件Spire.XLS教程:使用Python将CSV文件转换为列表
  • 2025年7-9级防弹窗供货厂家权威推荐榜单:4-6级防弹窗/防弹窗/抗爆防弹窗源头厂家精选
  • 2025年11月切削液公司排行对比:从资质认证到服务能力的全面评估
  • 2025 最新推荐!飞达剥标机厂家权威排行榜,贴标 / 前推式 / 后撤式 / 片料式机型及供料器优质厂家最新测评
  • 2025年11月西安口腔医院推荐排行:基于多维度数据的客观分析
  • 2025年11月高温链条油脂公司推荐榜单及综合对比分析
  • 【IEEE出版、已连续召开6届】 2025机器人与智能制造技术国际会议 (ISRIMT 2025)
  • 2025年11月机器人减速机油脂公司推荐榜单:五家优质供应商详细对比分析
  • 建筑人必备!Navisworks 2025 协同神器 大型项目协作天花板 安装
  • 2025年11月不锈钢精密铸造厂家评价:详析各企业优势与适用场景
  • 2025年11月机器人减速机油脂公司推荐榜单与深度对比分析
  • 2025年11月不锈钢精密铸造厂家详细评测与排行解析
  • 2025年食堂承包服务十大推荐榜单:专业选择指南
  • 2025年11月不锈钢精密铸造厂家排行与选购要点全指南
  • vscode 远程连接下载失败解决
  • 深入解析:自动驾驶---基于安全走廊的端到端
  • 2025年国内靠谱的石笼网供应商口碑推荐榜,双隔板石笼网/六角石笼网/柔韧抗压石笼网/锌铝合金石笼网/镀锌低碳钢丝石笼网源头厂家怎么选择
  • 2025年11月无缝钢管推荐榜:主流供应商多维对比与选购指南
  • 2025 年 11 月管道十大品牌和实力工厂推荐排行榜:PVC管道,PPR管道,市政管道,民用管道,深塑管道,HDPE波纹管道公司推荐
  • 2025年11月无缝钢管供应商排行:客观数据支撑的选购参考
  • 新手学敏捷:先背公式还是先跑项目?我的血泪经验
  • 2025年11月无缝钢管市场评价排行:性价比与可靠性多维度分析