如何识别 "wrong" 个指针
how to recognise "wrong" pointers
我正在使用基于 PYKD 库的脚本 heap_stat(该脚本对 !heap -h 0
结果执行 Ptrptr()
并从那里继续)。
这个 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。
回应 IInspectable 的评论:这真是一个巧合,正好有那个数字。但这让我思考:这个数字有没有限制,其实很简单:
CStringArray
(或与此相关的任何其他 MFC
集合)的大小是 int
,这意味着它受 INT_MAX
(是2^21-1
).
所以,我调整了我的 heap_stat 脚本,过滤掉所有 MFC
个大小大于 2^21-1
的对象。
我正在使用基于 PYKD 库的脚本 heap_stat(该脚本对 !heap -h 0
结果执行 Ptrptr()
并从那里继续)。
这个 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。
回应 IInspectable 的评论:这真是一个巧合,正好有那个数字。但这让我思考:这个数字有没有限制,其实很简单:
CStringArray
(或与此相关的任何其他 MFC
集合)的大小是 int
,这意味着它受 INT_MAX
(是2^21-1
).
所以,我调整了我的 heap_stat 脚本,过滤掉所有 MFC
个大小大于 2^21-1
的对象。