怎样用windbg查看Hashtable
How to view hashtable using Windbg:
由于hashtable结构比较复杂,但又比较常用,所以这次记录一下用windbg去view hashtable的过程。
先看一下我的测试代码:
class Program
{
static void Main(string[] args)
{
Hashtable _hash = new Hashtable();
_hash.Add("key1", "value1");
_hash.Add("key2", "value2");
_hash.Add("key3", "value3");
Console.WriteLine("Waiting!");
Console.ReadLine();
}
}
然后执行该程序,接着打开windbg , attatch上这个进程。dso and do一下。
首先看到count是3,说明有三对值,接着可以看出keys 和values字段的地址是0,事实上hashtable的value和key是存在bucket数组里的(变量名buckets),我们可以看下它的结构:
private struct bucket
{
public object key;
public object val;
public int hash_coll;
}
容易看出,每一对key value对于一个bucket实例,相应的要占12byte。要想看key value,只能看这个buckets,先使用dumparray命令
ok,用这个命令就很看出了每个bucket实例字段的地址,例如第一个key的地址是01271be8 ,value的地址是01271c04 ,接着你就可以用do命令查看具体的值了。
当然,你可能会奇怪,为什么我们仅仅本来有三对值,这地方却出来这么多呢,那是因为hashtable基于性能上的考虑这样设计的,具体这个名词叫什么我也忘了。