分析转储:如何解释Windbg命令&#34;!heap -srch <address>&#34;输出?

时间:2018-01-08 15:16:43

标签: windows windbg dump

我正在分析Windows进程的转储,已使用procdump创建转储。

我想知道CMap个对象的某些集合(CAlarm)是什么样的(CAlarm对象是由我自己的程序创建的。)

为了做到这一点,我发布了以下命令:

1)我感兴趣的类型的地址是什么?

x /2 *!*CMap*CAlarm*`vftable*
00000001`3fc7b840 <application_name>!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const * __ptr64,CAlarm * __ptr64,CAlarm * __ptr64>::`vftable'

2)哪种对象属于这种特殊类型?

!heap -srch 00000001`3fc7b840
skipping searching 00000000014d6660 allocation of size 000000000002ee08 greater than 0000000000010000
skipping searching 00000000003fdf00 allocation of size 0000000000025ff0 greater than 0000000000010000
skipping searching 000000000042bf00 allocation of size 000000000001fff0 greater than 0000000000010000
=> no results, so let's do something else:

!heap -srch `3fc7b840
This gives a lot of objects, something like:
_HEAP @ 920000
          HEAP_ENTRY Size Prev Flags            UserPtr UserSize - state
    00000000009214a0 0002 0002  [00]   00000000009214b0    00010 - (busy)
...
_HEAP @ 860000
          HEAP_ENTRY Size Prev Flags            UserPtr UserSize - state
    00000000008612e0 00ce 00ae  [00]   00000000008612f0    00cd0 - (free)

现在让我们使用UserPtr条目(让我们从最后一个开始):

0:000> dt <application_name>!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,CAlarm *,CAlarm *> 00000000008612f0
 +0x000 __VFN_table : 0x00000000`00860158 
 +0x008 m_pHashTable     : 0x00000000`00860158  -> 0x00000000`008612f0 CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,CAlarm *,CAlarm *>::CAssoc
 +0x010 m_nHashTableSize : 0
 +0x018 m_nCount         : 0n0
 +0x020 m_pFreeList      : (null) 
 +0x028 m_pBlocks        : (null) 
 +0x030 m_nBlockSize     : 0n0

这看起来很合理,但它是否正确?在查看另一个条目时,这是非常值得怀疑的:

0:000> dt <application_name>!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,CAlarm *,CAlarm *> 00000000009214b0
 +0x000 __VFN_table : (null) 
 +0x008 m_pHashTable     : (null) 
 +0x010 m_nHashTableSize : 0
 +0x018 m_nCount         : 0n1153117455832760832
 +0x020 m_pFreeList      : (null) 
 +0x028 m_pBlocks        : (null) 
 +0x030 m_nBlockSize     : 0n0

=&GT;我的CMap绝对没有多少元素。

看起来我以错误的方式使用x /2结果作为!heap -srch命令的输入。有人知道这样做的正确方法是什么吗?

0 个答案:

没有答案