You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Visual Studio调试时如何查看应用程序中的所有对象?

Visual Studio调试时如何查看应用程序中的所有对象?

必须安排!我平时调试遇到这种要揪内存里“顽固”对象的情况,全靠这些技巧,给你拆解几个实用的方法:

  • 方法一:用诊断工具的内存快照揪出特定类的所有实例
    这是我最常用的“神器”,找内存泄漏或者 rogue 实例特别好用:

    1. 调试时确保程序处于暂停状态(比如打个断点停住)
    2. 打开「诊断工具」(默认调试时会自动显示,没显示的话按Ctrl+Alt+F2调出)
    3. 切换到「内存使用」标签页,点击「拍摄快照」
    4. 快照生成后,在「对象」列表里直接搜索你的类名,就能看到该类的所有存活实例
    5. 选中任意实例,还能查看它的引用链,搞清楚到底是谁在“抓着”它不让GC回收
  • 方法二:用即时窗口快速查询特定类实例
    如果只是快速排查,不想拍快照,用即时窗口(Ctrl+Alt+I打开)更高效:
    在窗口里输入以下代码(把YourNamespace.YourClassName替换成你的类的完整名称):

    System.Linq.Enumerable.ToList(System.GC.GetAllocatedObjects().Where(o => o.GetType() == typeof(YourNamespace.YourClassName)))
    

    按回车后就能看到所有该类的存活实例,还能展开查看每个实例的属性细节。注意这个方法需要你的项目基于.NET Core 3.0+ / .NET 5+,因为GC.GetAllocatedObjects()是这些版本才支持的API。

  • 方法三:用对象ID跟踪单个“可疑”对象
    如果你已经发现某个对象可能有问题,但它会跑出当前作用域,用对象ID能一直“盯”着它:

    1. 在「局部变量」或「自动窗口」里找到目标对象,右键选择「创建对象ID」
    2. 系统会给它分配一个类似$1的ID,哪怕这个对象不在当前作用域了,你也能在即时窗口里输入? $1来查看它的最新状态
    3. 调试过程中还能通过这个ID检查对象是否被GC回收,非常适合跟踪生命周期异常的对象
  • 方法四:查看线程范围内的对象
    如果只想看某个线程的对象,先在「线程窗口」(Ctrl+Alt+H打开)选中目标线程,然后:

    1. 打开「内存窗口」(Ctrl+Alt+M,选其中一个内存窗口)
    2. 在内存窗口的地址栏输入线程的栈起始地址(线程窗口里能看到该信息),就能查看该线程栈上的所有对象
    3. 也可以结合即时窗口查询该线程关联的托管堆对象,配合线程调用栈一起分析,定位线程内的“漏网之鱼”

这些方法组合起来,基本能搞定绝大多数查看对象的需求,尤其是找内存里的 rogue 实例,用内存快照+引用链分析一抓一个准!

火山引擎 最新活动