我正在使用基于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的地方。
答案 0 :(得分:0)
响应IInspectable的评论:这确实是一个巧合,确切地具有该数字。但这让我思考:这个数字有任何限制,实际上,这很简单:
CStringArray
(或与此相关的任何其他MFC
集合)的大小为int
,这意味着它受INT_MAX
(即{{ 1}})。
因此,我调整了我的heap_stat脚本,过滤出了所有2^21-1
对象,这些对象的大小大于MFC
。