繁体   English   中英

在 Visual Studio 中调试 .NET 应用程序时,如何查看异步堆栈跟踪?

[英]How can I view the async stack traces while debugging a .NET application in Visual Studio?

我试图找出基于复杂 C# 的应用程序中(可能的)memory 泄漏的原因。 由于应用程序的高 CPU 和 memory 使用率导致系统变得非常缓慢和不稳定,因此我无法在运行时调试问题,我在运行时通过任务管理器创建了应用程序的转储 (dmp) 文件,然后打开该文件转储以在我的本地 Visual Studio 2022 实例中进行进一步分析。 当我现在尝试在创建转储时查看应用程序的线程时,它只向我显示调用堆栈,直到执行异步操作为止。 在这个异步执行中发生的一切似乎都无法访问。 在调用堆栈中它只是说它正在等待异步进程,我应该双击或按 Enter 以显示异步调用堆栈。 但是,这似乎没有任何作用。 我是否遗漏了什么,或者我如何才能看到异步过程中发生了什么?

The typical approach to find memory leaks would be to create two or more memory snapshots/dumps and compare them with a memory debugger to see if there is some type of object that seem to only increase in count. 在尝试查找 memory 泄漏时,我不确定堆栈跟踪是否会提供这么多价值。

我主要使用 dotMemory 但没有隶属关系。 我希望大多数有能力的工具都具有相同的功能,但术语可能会有所不同。

应该有一个 比较视图,您应该能够按delta countdelta bytes对 object 进行排序。 这通常可以很好地指示哪些对象正在泄漏。

一旦有了候选类型,您应该能够检查该类型的实例,并以某种方式查看保留图,您可以在其中查看使实例保持活动状态的对象图。 如果您发现任何可疑之处,您应该查看代码并查看是否存在泄漏的可能性。

常见原因是未注册的事件处理程序。 如果 object 注册了一个事件处理程序,它还应确保它未注册。 如果在构造函数中完成,则应在 dispose 方法中实现 IDisposable 并取消注册,并确保始终释放 object。 可能使用仅针对未处置对象运行的终结器,它记录或以其他方式提醒您 object 未处置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM