Скрипт Windbg, использующий as / c внутри .foreach, .if,! For_each_local - PullRequest
1 голос
/ 03 апреля 2019

Моя цель - сохранить имя класса объекта с именем this, найденного в локальных элементах фрейма. Когда вы смотрите на эту последовательность команд, я нарушаю некоторые синтаксические правила Windbg, которые означают, что команда as, похоже, не выдает никакой ошибки, но также не устанавливает псевдоним как I хотел бы?

Это немного смущает меня, потому что псевдоним был явно установлен в изолированной команде .foreach, которую я использовал ранее, и теперь я просто вкладываю это (хотя я также пытался as /c в сочетании с .printf) дальше ...

0:133> ad /q *
0:133> al
No aliases
0:133> .foreach /pS 1 /ps 4 (Token {dv /t this}) { as myClass Token }
0:133> al
  Alias            Value  
 -------          ------- 
 myClass          foo  
0:133> ad /q *
0:133> al
No aliases
0:133> !for_each_local .if ($spat ("@#Local","this") == 1) { .foreach /pS 1 /ps 4 (Token { dv /t this }) { .printf "${Token}\n" } }
foo
0:133> !for_each_local .if ($spat ("@#Local","this") == 1) { .foreach /pS 1 /ps 4 (Token { dv /t this }) { as myClass Token } }
0:133> al
No aliases
0:133> !for_each_local .if ($spat ("@#Local","this") == 1) { .foreach /pS 1 /ps 4 (Token { dv /t this }) { as /c myClass .printf "${Token}" } }
0:133> al
No aliases

Похоже на сложность as, я тоже могу счастливо использовать .echo ${Token}, но я не могу использовать as с ${Token}. Я пробовал комбинации aS и точки с запятой безрезультатно, и я уверен это просто вопрос синтаксиса, и это задокументировано, но я больше не вижу дрова для деревьев.

Последняя попытка, я пытался - !for_each_local .if ($spat ("@#Local","this") == 1) { .foreach /pS 1 /ps 4 (Token { dv /t this }) { as /c myClass .echo ${Token} } } - Ба !!!

1 Ответ

1 голос
/ 04 апреля 2019

Команды расширения (! -команды; bang-команды) в целом плохо работают с псевдонимами.

Вы можете попробовать это с помощью упрощенной команды:

0:000> al
No aliases
0:000> !for_each_module as x y
0:000> al
No aliases

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

Для упрощенного примера:

0:000> ad *
0:000> al
No aliases
0:000> .foreach (Token {!for_each_module .echo y}) {;as x Token}
0:000> al
  Alias            Value  
 -------          ------- 
 x                y 
 y                y 

Обратите внимание, как псевдоним расширился во втором расширении. Вы можете попытаться избежать этого с помощью еще нескольких /ps параметров.

Ваша команда может стать такой же безобразной, как:

.foreach /ps 1000 (result { !for_each_local .if ($spat ("@#Local","this") == 1) { .foreach /pS 1 /ps 4 (Token { dv /t this }) { .printf "${Token}\n" } }}) {;as myClass result}
...