Windbg .printf псевдоним строки из as / c - PullRequest
0 голосов
/ 28 марта 2019

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

Можно ли сделать то же самое с .printf, если я определю псевдоним a2 как CommandString с 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 для отображения псевдонимов строк, иначе я мог бы просто написать это ... Мне показалось странным, если я не пропустил что-то очевидное.

Ответы [ 2 ]

1 голос
/ 28 марта 2019
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 "%ma\n" , 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 голос
/ 28 марта 2019

Вы, кажется, немного озадачены тем, как работают псевдонимы (и поверьте мне, это совершенно нормально, они довольно не интуитивны! Мне понадобилось время, чтобы понять, как они работают, и все же я не уверен на 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, он запутается!

Правило большого пальца с псевдонимами - смелое предложение, которое я думаю выше.Примите их как макросы, которые будут заменены препроцессором.

...