Псевдоним строки Windbg .printf из as / c

#printf #alias #windbg #aliases

#printf #псевдоним #windbg #Псевдонимы

Вопрос:

Надеюсь, это простой вопрос, но если я определю псевдоним a1 как выражение 1 1 с помощью as /x a1 1 1 , то я смогу отобразить это через .echo a1 или .printf "a1 = %d", a1 .

Возможно ли сделать то же самое с, .printf если я определю псевдоним a2 как CommandString with as /c a2 dv /t this ?

Я, конечно, могу .echo это сделать, но попытка сделать что-то подобное .printf "a2 = %ma", a2 выдает Couldn't resolve error at ошибку, например:

 .printf "a2 = %ma", a2
class Blah:Blah:Blah * this = 0x00000000194dacf0
 = Couldn't resolve error at 'class Blah::Blah::Blah * this = 0x00000000194dacf0
'
  

Это то же самое, если a2 определено с помощью as /c a2 .printf "hello" . Я не смог найти примеров того, .printf что используется для отображения псевдонимов строк, иначе я мог бы просто списать это… Мне это показалось странным, если только я не упускаю чего-то очевидного.

Ответ №1:

 0:000> dv /t this
class Student * this = 0x000000c5`d6f6f910
0:000> as /c foo dv /t this
0:000> al
  Alias            Value  
 -------          ------- 
 foo              class Student * this = 0x000000c5`d6f6f910

0:000> .printf "${foo}"
class Student * this = 0x000000c5`d6f6f910
  

вы приняли это, но я собирался задать вам этот вопрос в комментарии, вместо этого отредактировал ответ

Я ответил на запрос, но почему вы пытаетесь использовать %ma?? предполагается, что строка ascii печатается в целевом виртуальном адресном пространстве, например

 0:000> .printf "%man" , poi(poi(this) 8)
dave
  

отредактируйте использование интерпретатора псевдонимов

 0:000> .printf "to check if an alias is defined use ${/v:foo} ${/n:foo} == 1 n" 
to check if an alias is defined use ${/v:foo} foo == 1 

0:000> .printf "to expand an alias  ${/n:foo} use ${/v:foo} == ${foo} " 
to expand an alias  foo use ${/v:foo} == class Student * this = 0x000000c5`d6f6f910
  

Комментарии:

1. К этому не %ma я был привязан, это было просто то, что я пробовал, поскольку я не мог понять, как использовать .printf псевдоним со строковым значением в нем, и это работало для выражения / числового значения с %d . На самом деле это был вопрос больше о синтаксисе … Я знал, что я хотел сделать, и что это должно быть возможным, но не смог найти ничего, указывающего, как это сделать.

2. хорошо, просто сбросьте все эти тупые псевдонимы скриптов и т.д. (да, я могу ввести их как perlmonk, но я все равно предлагаю удалить их) и используйте javascript, вы можете просто писать разборчивые скрипты вместо @$ foo-@$ blah ==@$ confuing

3. ну, это задокументировано в $ {alias interpreter} в любом случае, я добавил пример использования

Ответ №2:

Кажется, вы немного сбиты с толку тем, как работают псевдонимы (и поверьте мне, это совершенно нормально, они довольно неинтуитивны! Мне потребовалось некоторое время, чтобы понять, как они работают, и я все еще не уверен на 100%, но позвольте мне ответить на ваш вопрос!)

Во-первых, не принимайте псевдонимы в качестве «переменных»! Это не символьные имена для сохранения определенных значений. Они больше похожи на макросы (которые заменяются препроцессором, если они назначены).

Чтобы действительно заметить разницу, обратите более пристальное внимание на способ .printf "a1 = %d", a1 работы. Я не знаю, есть ли у нас разные версии, или это связано со странным правилом интерпретации псевдонимов о «вводе нового блока», но это то, что я вижу:

 0:000> as /x a1 1 1
0:000> .echo a1
0x2
0:000> .printf "a1 = %d", a1
0x2 = 2
  

Обратите внимание, что он не говорит, a1 = 2 а также заменяет a1 внутри цитаты (или, скорее, везде, где он это видит). Это как если бы он выполнял поиск и замену строки перед выполнением команды!

Итак, во втором примере, опять же, вывод этой команды заменяется строкой как в кавычках спецификатора формата printf, так и после (когда он используется в качестве аргумента). И если вывод этой команды не похож на список аргументов printf, это приведет к путанице!

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

Комментарии:

1. Возможно, я в замешательстве. 😉 Однако это полезно, как и приведенный ниже ответ, который дает мне синтаксис, который я хотел видеть… я и не подозревал, что это будет просто .printf "${AliasName}" .