为了追踪内存泄漏,我一直在使用 Visual Studio 和 SOS.dll 来提供对象堆的转储,并查看 GCRooting 特定对象的位置。
我开始使用 AutoIt 自动化这个过程来控制我的鼠标和键盘。这是我的脚本第一部分的近似值:
在 Visual Studio 中按 F5 开始执行
让程序完全加载
切换到 Visual Studio 并中断执行将焦点切换到即时窗口
Load SOS.dll
Call!dumpheap -stat
将转储结果复制到剪贴板
粘贴到记事本中并另存为 dump1.txt继续执行
多次执行泄漏操作
切换到 Visual Studio 并中断执行将焦点切换到即时窗口
清除输出
Call!dumpheap -stat
将转储结果复制到剪贴板
粘贴到记事本并另存为 dump2.txt运行一个 Python 脚本,比较两个转储并定位泄漏的对象
不过,我对我目前的方法有一些担忧。我不仅依赖于 Visual Studio 的安装,而且在脚本运行时,我无法使用鼠标或键盘而不会使自动化顺序混乱。
有没有办法在 C# 程序而不是 Visual Studio 中使用 SOS.dll?理想情况下,此解决方案将附加到指定进程并将结果输出!dumpheap -stat
到文本文件,而无需自动化 Visual Studio。