Я работаю с heap_stat, скриптом, основанным на библиотеке PYKD (скрипт выполняет 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 в моем исходном коде.