В этом вопросе я хотел заменить DbgCommand("dt ...")
вызовом API, и на помощь пришла команда PYKD
typedVar()
.
В результате мойСкрипт heap_stat (расширенный с m_nSize
и m_nCount
информацией) теперь работает в три раза быстрее.
Для вашей информации, я сделал эту замену для вычисления количества членов в коллекции STL:
Replace: collection_Size = dbgCommand(("dt 0x" + pointer_format + " %s m_nSize") % (ptr,type_name)).split(' : ').[-1].split('\n')[0]
By: collection_Size = typedVar(type_name, ptr).m_nSize
В результате этого успеха я хотел бы заменить другие DbgCommand
запросы вызовами API.
Для случая dbgCommand('!heap -h 0')
это, кажется, не так просто(некоторые примеры):
>>> for t in targetHeapIterator():
... print t
...
Traceback (most recent call last):
File "<console>", line 1, in <module>
RuntimeError: This class cannot be instantiated from Python
>>> for t in targetHeap().entries:
... print t
...
Traceback (most recent call last):
File "<console>", line 1, in <module>
RuntimeError: This class cannot be instantiated from Python
>>> for t in targetProcess().getManagedHeap().entries:
... print t
...
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: 'instancemethod' object is not iterable
Как я могу перебрать кучу моего процесса (заменив !heap -h 0
)?
PS Даже если targetHeap()
не может использоваться какзамена для !heap -h 0
, я все еще хотел бы знать, как использовать это для целей расследования.