来自/ c的windbg .printf字符串别名

时间:2019-03-28 10:10:59

标签: printf alias windbg aliases

希望这是一个简单的问题,但是如果我将别名a1定义为带有1+1的表达式as /x a1 1+1,则可以通过.echo a1 .printf "a1 = %d", a1

如果我将别名.printf定义为a2的{​​{1}},是否可以对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"用于显示字符串别名的示例,否则我只能将其婴儿床……我认为这很奇怪,除非我缺少明显的内容。

2 个答案:

答案 0 :(得分:1)

您似乎对别名的工作方式有些困惑(并且相信我,这是完全正常的,它们很不直观!花了我一些时间来了解它们的工作方式,但我仍然不确定100%,但是让我对你的问题a之以鼻!)

首先,不要将别名用作“变量”!它们不是保留某些值的符号名称。它们更像是宏(如果分配了宏,则将替换为预处理器)。

要真正注意到差异,请更加注意.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 :(得分: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 "%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