如何识别“错误”的指针

时间:2019-05-02 15:19:19

标签: c++ mfc dump pykd

我正在使用基于PYKD库的脚本heap_stat(脚本对Ptrptr()的结果执行!heap -h 0,然后从那里继续)。

从以下摘录中可以看到,此heap_stat脚本有时包含错误的结果:

heap_stat源代码:

if (type_name.endswith("CStringArray") or
    ... :
    if type_name.endswith("CStringArray"):
        collection_Size = typedVar('CStringArray', ptr).m_nSize
    elif 
    ...
    try:
        dprintln(("0x" + pointer_format + "\t%s\t Size:[%d]") % (ptr, type_name, collection_Size))

结果摘录:

...
0x000002660b40d890      mfc140u!CStringArray     Size:[9],
...
0x000002660ae8c6d0      mfc140u!CStringArray     Size:[8589934592]
...

在Visual Studio中进行验证会产生以下结果:

-    (CStringArray*)0x000002660b40d890    0x000002660b40d890 {size = 9, pointer : 0x000002660b40d890}
    [size]      9    __int64
    [capacity]  9    __int64
    [grow by]   0    __int64
+    [0]    L""    mfc140u.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >
+    [1]    L""    mfc140u.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >
+    [2]    L""    mfc140u.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >
+    [3]    L""    mfc140u.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >
+    [4]    L""    mfc140u.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >
+    [5]    L""    mfc140u.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >
+    [6]    L""    mfc140u.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >
+    [7]    L""    mfc140u.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >
+    [8]    L""    mfc140u.dll!ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >

=>正确

-    (CStringArray*)0x000002660ae8c6d0    0x000002660ae8c6d0 {size = 8589934592, pointer : 0x000002660ae8c6d0}
    [size]      8589934592    __int64
    [capacity]  8589934594    __int64
    [grow by]   8589934594    __int64
+    [Raw View]    0x000002660ae8c6d0 {m_pData=0x88000000bb1d05ba ??? m_nSize=8589934592 m_nMaxSize=8589934594 ...}

=>错误:这似乎是一个不再有效的对象的剩余部分。

我的问题:PYKD中是否有任何功能可以过滤掉那些错误的对象?在Visual Studio中进行调试时,是否甚至可以识别这些内容?不要忘记:那些剩菜剩饭是什么?我认为在我的源代码中delete array_with_strings中没有一个array_with_strings是CStringArray的地方。

1 个答案:

答案 0 :(得分:0)

响应IInspectable的评论:这确实是一个巧合,确切地具有该数字。但这让我思考:这个数字有任何限制,实际上,这很简单:

CStringArray(或与此相关的任何其他MFC集合)的大小为int,这意味着它受INT_MAX(即{{ 1}})。

因此,我调整了我的heap_stat脚本,过滤出了所有2^21-1对象,这些对象的大小大于MFC