我正在使用基于 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 中调试时,甚至有办法识别它们吗?不要忘记:那些剩菜是什么?我认为我的源代码中没有太多 CStringArray 的delete array_with_strings
位置。array_with_strings