我一直在观看 Mario Hewardt 关于.NET 内部和高级调试技术的 Pluralsight 课程,并且在 CLR 中遇到了句柄的概念。
现在我已经找到了关于什么是句柄的很棒的答案,但是马里奥指的是句柄类型:
- 强力手柄
- 固定手柄
- 异步固定句柄(SO 描述)
- 参考计数句柄
- 弱长柄
- 弱短柄
- 其他手柄
视频中并未真正解释这些内容,我认为这是参加本课程的人所期望的知识。
我做了一个谷歌,并不能真正找到一个令人满意的描述这些是什么,所以我希望一个 SO 用户可以帮助我。
我在windbg的笔记中发现了这一点:
#ESP - ESP=扩展堆栈指针,对象正在堆栈上使用(注意,!gcroot 可能会在此处返回误报,请阅读 !help gcroot in windbg)
#DOMAIN(x):HANDLE(Strong) - 强引用,通常是静态变量
#DOMAIN(x):HANDLE(WeakLn) - 弱长句柄,通过终结跟踪的弱引用(可以复活)
#DOMAIN(x):HANDLE(WeakSh) - 弱短句柄,弱引用,无法复活
#DOMAIN(x):HANDLE(Pinned) - 固定对象,固定在特定地址,在垃圾回收期间不能移动。
#DOMAIN(x):HANDLE(RefCnt) - 引用计数,只要引用计数 > 0 就被引用。
我很久以前就从一些 MSDN 博客中获取了它,我相信它可能是Tess',但我现在无法准确追踪它。(顺便说一句,如果您正在研究 .net 调试但您还不知道它并想使用 windbg/sos/sosex,那么这里就是学习的地方)。
Alejandro Campos Magencio 也有一系列关于使用 windbg 和 sos 进行调试的精美文章;在第 3 部分中,您可以找到对大多数 GC 句柄类型定义的一些确认。