Итерация по выводу! DumpHeap для чтения значения со смещением памяти
Я пытаюсь придумать выражение командной строки WinDbg, которое принимает вывод!DumpHeap
команда и для каждого адреса читает 64-битное значение из смещения0x08
после адреса. Я думаю, что это возможно (не уверен в этом), но каждая попытка, которую я сделал до сих пор, терпит неудачу с некоторой ошибкой.
Я много искал, но большинство статей о WinDbg показывают простые примеры, которые я могу попробовать, но мои попытки терпят неудачу.
У меня есть дамп процесса рабочего процесса ASP.NET. Процесс имеет некоторый рост памяти, но нет явного нарушителя, поэтому я пытаюсь перечислить несколько объектов, которые много раз появляются в памяти. Я использую sos.dll для управляемой отладки расширений WinDbg.
Вот что я пытаюсь сделать
.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8})
{r @$t0=poi(myaddress+0x8);!do @$t0;.echo ************* myaddress}
Обратите внимание, что приведенная выше команда должна быть в одной строке - здесь я добавил разрыв строки только для лучшей читабельности.
Для приведенной выше строки WinDbg печатает эту ошибку:Couldn't resolve error at 'myaddress+0x8);!do @$t0;.echo ************* 00000001003cb870'
.
Я пытаюсь перебрать все адреса, возвращенные!DumpHeap
- каждый адрес должен идти вmyaddress
переменная. Затем для каждого адреса я пытаюсь установить$t0
пользователь регистрируется на значение, прочитанное изmyaddress+0x8
,!do
(!DumpObject
) команда затем выдаст объект по этому адресу.
Если я бегу только (опять же на одной строчке в WinDbg):
.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8})
{!do myaddress;.echo ************* myaddress}
Я получаю список объектных дампов, но это на один уровень выше, чем мне нужно. Я хочу углубиться на один уровень глубже и выбросить определенный член из этих объектов верхнего уровня, через которые я перебираю.
Это возможно, или я не на том пути?