使用Visual Studio分析.NET Dump

news/2025/3/18 18:41:58/文章来源:https://www.cnblogs.com/Can-daydayup/p/18232050

前言

内存泄漏和高CPU使用率是在日常开发中经常遇到的问题,它们可能会导致应用程序性能下降甚至崩溃。今天我们来讲讲如何使用Visual Studio 2022分析.NET Dump,快速找到程序内存泄漏问题。

什么是Dump文件?

Dump文件又叫内存转储文件或者叫内存快照文件。用于存储程序运行时的状态信息的文件,这些文件通常包含了程序运行时的内存内容、线程信息、堆栈调用信息、异常信息等数据。Dump文件可以在程序崩溃、失去响应、资源消耗过高或者性能不理想等情况下生成,以帮助开发人员进行故障排查和调试。

编写一段内存泄漏的代码

下面我们编写一段死循环代码用于演示内存泄漏的情况:

    internal class Program
    {
        static List<List<string>> memoryLeakList = new List<List<string>>();

        static void Main(string[] args)
        {
            //编写一段死循环代码用于演示内存泄漏的情况
            //每次迭代都会创建一个新的List<string>对象并将其添加到一个静态的List<List<string>>集合中,但却没有释放这些对象,从而导致内存泄漏
            while (true)
            {
                var newList = new List<string>();
                for (int i = 0; i < 1000; i++)
                {
                    var currentValue = i + " - " + Guid.NewGuid().ToString();
                    Console.WriteLine(currentValue);
                    newList.Add(currentValue);
                }
                memoryLeakList.Add(newList);
            }
        }
    }

查看程序运行情况并创建Dump文件

程序运行内存泄漏情况

创建转储文件(Dump文件)

使用Visual Studio分析Dump

打开Dump文件

使用打开TestConsoleApp (2).DMP文件:

运行诊断分析

诊断分析结果(定位内存泄漏位置)

因为我们要查看程序内存泄漏问题,所以我们针对性的查看线程调用堆栈结果即可。

课外拓展:因为线程调用堆栈是在内存上操作的,每个线程都有自己的调用堆栈,用于跟踪当前执行的方法和函数调用关系。当您在应用程序中启动一个线程时,系统会为该线程分配一定的内存来存储它的调用堆栈信息。

更多Visual Studio编程效率提升技巧

  • https://github.com/YSGStudyHards/DotNetGuide
  • Visual Studio编程效率提升技巧集(提高.NET编程效率)

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
  • 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群👪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/720138.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot模块化开发项目搭建

1.New一个Project,命名,Next,Finish 2.根据需要修改Maven配置 3.初始化后,删除无用文件4.选中项目创建Module,命名,Next,一般模块包括common、dao、service、web、entrance(入口文件),也可以增加订单、会员等各种业务模块,各模块之间依赖引用即可5.删除无用文件,删…

组合数学中的食用工具

背景: 教授在打概率和期望中的《灯蹬登》,需要推式子。众所周知,一个正确的式子不光要可以解释已有的数据,还要能预测未知数据的结果。在这样的情况下,组合数学的工具是必不可少的。我们通过这个工具实现了三种计算器无法直接实现的功能:输入\(A,m,n\),表示求\(A^m_n\)的…

读AI未来进行式笔记03自然语言处理技术

自然语言处理1. AI伙伴 1.1. 作为AI能力的集大成者,AI伙伴融合了各种复杂的AI技术 1.2. 人类唯一可能超越AI的领域,只可能在机器无法触及之处,那是属于人类感性与直觉的领域 1.3. 要读懂人类,需要漫长而平缓的学习过程 1.4. AI塑造了我们,我们反过来也塑造了AI 1.5. AI的“…

PyQT5之单行文本输入到多行显示窗

from PyQt5 import QtWidgets from PyQt5 import QtCore, QtGui import sys import cv2class TextDemoPanel(QtWidgets.QWidget):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)select_btn = QtWidgets.QPushButton("输入")self.line_text …

ipsec-vpen核心demo

撸起袖子加油干!!!

什么是Transform转换

在WPF框架中有一个抽象类叫Transform,它定义了实现二维平面中的转换的功能。它包括旋转 (RotateTransform)、缩放 (ScaleTransform)、倾斜 (SkewTransform) 和平移 (TranslateTransform)4个子类。它定义如何将点从一个坐标空间映射或转换到另一个坐标空间。 此映射由转换 Matr…

Kubernetes – NodePort 服务

Kubernetes 中的 NodePort 服务是一种用于将应用程序公开到互联网的服务,最终用户可以从互联网访问它。如果您创建 NodePort 服务,Kubernetes 将分配 (30000-32767) 范围内的端口。最终用户可以使用节点的 IP 地址访问该应用程序。 Kubernetes 服务的类型 在Kubernetes 中,有…

造车新势力盘点

造车新势力盘点 雷军大声疾呼:“大家不要在小问题上卷了,没有价值!” 余承东表态:“要卷价值而不是卷价格!卷智能化、自动化,卷安全、高质量,卷卓越的、舒享的用户体验。” 6月1日,在第二届未来汽车先行者大会上,雷军、余承东等车企负责人发表了“反内卷”宣言。 确实…

未来门店画像

众多互联网企业,正在致力于帮助传统线下门店,进行数字化改造升级,场景、体验、品类重构、数字化……如今,各大零售商、品牌商正在朝着各个方向,努力打造“下一代零售门店”。 01 用户心智 从“单点突破”到“多点穿透” 现在消费者已经从单纯“找”货,升级成“找”货、“…

【git实际应用填坑解决】

工作中git填坑之路,有时候用小乌龟,有时候也用git命令。 - git 如何管理多个项目仓库? 1. git subtree 实现管理多仓库 A、 B 、 lib 都是仓库,其他lib是公共模块,在A,B中都有使用 优点: 提交方便,直接在当前项目目录就可修改公共模块lib并提交 在项目A 和 B 中创建公共…

36氪研究院 | 2023年中国工业软件行业洞察报告

36氪研究院 | 2023年中国工业软件行业洞察报告 36氪研究院2023-04-12 10:53关注国产替代蓝海市场,ChatGPT掀起智能化浪潮1、行业定义及发展历程 工业软件指应用于工业领域,以提高工业企业研发、生产、管理水平和工业装备性能为目的的应用软件,包括在工业互联网平台上运行的工…

git实际应用填坑解决

工作中git填坑之路,有时候用小乌龟,有时候也用git命令。 - git 如何管理多个项目仓库? 1. git subtree 实现管理多仓库 A、 B 、 lib 都是仓库,其他lib是公共模块,在A,B中都有使用 优点: 提交方便,直接在当前项目目录就可修改公共模块lib并提交 在项目A 和 B 中创建公共…