怎样用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一下。

image

 

 

首先看到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命令

image

ok,用这个命令就很看出了每个bucket实例字段的地址,例如第一个key的地址是01271be8 ,value的地址是01271c04 ,接着你就可以用do命令查看具体的值了。

当然,你可能会奇怪,为什么我们仅仅本来有三对值,这地方却出来这么多呢,那是因为hashtable基于性能上的考虑这样设计的,具体这个名词叫什么我也忘了。

image

posted @ 2009-09-02 11:23  彷徨......  阅读(546)  评论(0编辑  收藏  举报