gpt4 book ai didi

c# - 如何在 C# 程序中使用 SOS.dll 进行自动调试?

转载 作者:行者123 更新时间:2023-11-30 13:48:34 26 4
gpt4 key购买 nike

为了追踪内存泄漏,我一直在使用 Visual Studio 和 SOS.dll 来提供对象堆的转储,并查看什么是 GCRooting 特定对象。

我开始使用 AutoIt 来自动执行此过程以控制我的鼠标和键盘。这是我的脚本第一部分的近似值:

In Visual Studio, press F5 to start execution
Let the program fully load
Switch to Visual Studio and break execution

Switch focus to the immediate window
Load SOS.dll
Call !dumpheap -stat
Copy the result of the dump to the clipboard
Paste in notepad and save as dump1.txt

Resume execution
Perform the leaky action a number of times
Switch to Visual Studio and break execution

Switch focus to the immediate window
Clear the output
Call !dumpheap -stat
Copy the result of the dump to the clipboard
Paste in notepad and save as dump2.txt

Run a Python script which compares the two dumps and locates leaked objects

不过,我对我目前的方法有一些顾虑。我不仅依赖于 Visual Studio 的安装,而且在脚本运行时我无法使用鼠标或键盘,否则会导致自动化顺序困惑。

有没有办法在 C# 程序而不是 Visual Studio 中使用 SOS.dll?理想情况下,此解决方案将附加到指定进程并将 !dumpheap -stat 的结果输出到文本文件,而无需自动化 Visual Studio。

最佳答案

下面我将介绍一些您可以用来查找漏洞的不同方法。

(如果您不想采用 DIY 方法,可以使用商业“泄漏”检测器)。

链接到我的答案,详细介绍了很多调试工具/资源

将SOS.DLL加载到WinDBG中

您实际上不需要 Visual Studio 来使用 SOS.DLL....它是一个调试器扩展,因此也可以在 WinDBG 中使用。

作为 Windows 调试工具的一部分,您可以免费获得 WinDBG 调试器。

然后您可以编写一个 WinDBG 脚本来自动化您的“转储”。

另请注意,有增强版的 SOS.DLL 可用...查找 SOSEX、PSSCOR2(对于 NET 2)和 PSSCOR4(对于 NET 4)。

CLR 分析 API

您可以使用 CLR Profiling API。

有一个名为 CLRProfiler 的应用程序,它是一个使用它的实际 .NET 分析器......所以有很多代码可以了解它是如何使用的。

CLR Profiler 可以做的事情之一是允许进行堆转储,然后比较在不同时间段进行的转储,以找出差异......从而帮助发现泄漏。

您可以在“测试”模式下为您的应用程序提供类似的功能(嵌入到应用程序中,或作为监控它的配套实用程序)。

进程转储

您可以使用的另一种技术是定期“转储”您的进程,然后您可以使用 SOS/SOSEX(或任何其他 WinDBG 插件)通过 WinDBG 进行离线分析。

您可以使用 DebugDiag(您可以设置规则和操作来控制何时创建 .dmp 文件)自动创建 .dmp 文件....或称为 ProcDump.exe 的工具(来自 SysInternals)。

ProcDump 特别有用,因为它能够非常快速地获取“进程快照”,因为它使用了一种称为“进程反射”的技术......这可以让您的进程不那么积极地中断,例如

(创建 3 个转储,每个转储之间间隔 5 秒)

procdump -s 5 -n 3 notepad.exe notepad.dmp 

事后分析

在您拥有一组 .dmp 文件之后,您可以分析它们以查找泄漏、监控句柄使用情况等。

您可以在 WinDBG 中手动加载 .dmp 文件,然后发出调试器命令,或者您可以编写一个 WinDBG 扩展或者一个脚本,它获取转储文件集并依次处理它们(即运行 !dumpheap stat 命令在他们身上)。

调试分析器 .NET

这是一个旨在分析 .dmp 文件和进行事后分析的工具。

它允许您在 .NET 中编写脚本,因此可能比 WinDBG 更易于访问。

如果你想扩展它,它还有一个插件模型。

它允许您编写/使用可视化工具以独特的方式查看数据。

(目前只支持 CLR 2.0 内存转储...不支持 CLR 4.0)

关于c# - 如何在 C# 程序中使用 SOS.dll 进行自动调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12222873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com