View Code 四、基础知识
在这一段内容中,有的小节可能会包含两个部分,分别是 A 和 B,也有可能只包含 A,如果只包含 A 部分,A 字母会省略。A 是【基础知识】,讲解必要的知识点,B 是【眼见为实】,通过调试证明讲解的知识点。
4.1、SOS 和 Visual Studio 2022 集成 .Net Framework 版本
SOS 调试扩展(SOS.dll)通过提供有关内部公共语言运行时(CLR)环境的信息,帮助你在 Visual Studio 和 Windows 调试器(WinDbg.exe)中调试托管程序。 此工具需要你启用项目的非托管调试。 SOS.dll 自动随 .NET Framework 一起安装。 若要在 Visual Studio 中使用 SOS.dll,请安装 Windows 驱动程序工具包 (WDK)。
若要在 Visual Studio 中使用 SOS 调试扩展,请安装 Windows 驱动程序工具包 (WDK)。
如果想查看更详细的内容,可以点击连接查看:SOS.dll(SOS 调试扩展)
4.5.2、!FindRoots -gen | -gen any |
要找出某个对象还没有被收集的原因,是一个复杂的过程。如果根对象很简单,那么要找出它引用的对象并不困难,但有的时候,要找出对象的根对象引用并不容易。例如,如果在对象中包含了跨代(Cross-Generational)的引用,并且引用的代还没有被收集,那么这个对象看上去仍然是存活的。当检测到这些跨代的引用时,为了使工作更简单,可以使用FindRoots 命令。
FindRoots 命令指示运行时设置一个断点,这个断点可以被设置为在指定的代中下一次发生垃圾收集时(使用 gen 开关)触发,或者每当发生垃圾收集操作时就触发(使用 gen any 开关)。在断点被触发后,FindRoots命令将得到一个对象的地址,命令的执行结果是显示这个对象的根对象。