debugging - 什么是 mdToken?它与 MethodTable 有何不同?

标签 debugging clr windbg sos

如标题所示,它是什么以及它与 MethodTable 有何不同?

最佳答案

mdToken 是一个元数据标记,或者或多或少是元数据表中的行 ID(int 的一部分标识它所属的表,另一部分标识该表中的行)。

有两种类型的 token - 内部 token 和外部 token 。

内部 token 比外部 token 小,仅使用 4 个字节:3 个字节用于行 id,1 个字节用于表 id。 (我不确定 x64 的这些大小是否已更改,但您明白了) 示例:方法表中的第一行(从零开始)为 0x06000000。

外部标记(或编码标记)更大,并且适用于一系列表,而不是特定表。有几种不同的编码 token 类型,它们具有已知的模式,您必须了解这些模式才能理解它们的编码值。例如,HasCustomAttribute 标记可以是 19 个元数据表中任何一个的标记(因为属性可以附加到代码的许多不同部分)。编码 token 的一部分是表的 id,也称为标签(但用于保留这部分的位宽度因每个而不同 - 因此是已知的模式),其余部分留给行 id。外部标记的大小可能会有所不同 - 这有助于在行数较小时保持较小的大小。

关于debugging - 什么是 mdToken?它与 MethodTable 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7158836/

相关文章:

delphi - 无法进入for循环

.net - .net core 源码中如何维护局部变量使用信息

.net - VB.NET 可选参数如何工作 'Under the hood' ?它们是否符合 CLS?

c++ - WinDbg 分析 minidump (!analyze -v),那么 NULL_CLASS_PTR_DEREFERENCE、INVALID_POINTER_READ...等是什么?

stack - WinDBG 显示不完整的堆栈

java - IntelliJ 中生成代码的源代码级调试

javascript - 如何调试生产 Angular2/Typescript 应用程序?

c++ - 跟踪/跟踪在不同寄存器/内存位置传递的值?

c# - 哪些现有的 CLR 主机不提供托管和非托管线程之间的一对一映射?

debugging - 如何查看GDTR的值(value)?