2015-01-23 2 views
3

Я пытаюсь найти выражение командной строки WinDbg, которое выводит результат команды !DumpHeap и для каждого адреса считывает 64-битное значение из смещения 0x08 после адрес. Я думаю, что это возможно (не уверен в этом), но каждая попытка, которую я сделал до сих пор, не с некоторой ошибкой.Итерация через! Вывод DumpHeap для чтения значения при смещении памяти

Я много искал, но большинство статей 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} 

Я получаю список объектов свалках, но это один уровень выше, чем то, что мне нужно. Я хочу углубиться на один уровень глубже и сбросить определенный член этих объектов верхнего уровня, которые я выполняю.

Возможно ли это, или я ошибаюсь с этим?

+0

возможный дубликат [ Как отображать управляемые объекты с определенным значением в одном из полей в WinDbg с использованием SOS (или SOSEX)?] (Http://stackoverflow.com/questions/20765713/how-to-display-managed-objects-with-certain- value-in-one-of-the-fields-in-windbg) –

+0

@ ᵺṓᵯ ᵴ Да, это может быть дубликатом. – xxbbcc

ответ

4

После дальнейшего поиска я обнаружил, что использовал неправильный синтаксис. Согласно question и MSDN имена переменных должны быть окружены пробелами или должны быть заключены в ${...} для работы. После того, как я использовал корпус ${}, мой скрипт начал работать.

На будущее, вот как запустить скрипт (держать его в одной строке в WinDbg):

.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8}) 
{r @$t0=poi(${myaddress}+0x8);!do @$t0;.echo ************* myaddress} 
1

да вам нужно пространство вокруг псевдонимами

.foreach (place { .shell -ci "!DumpHeap -stat" sed 1,3d | awk "{print $1 }" }) { .foreach (plays { !DumpHeap -short -mt place }) { r $t0 = poi(plays + 8) ; !do @$t0 ; .echo ========================================= } }

Смежные вопросы