希望这是一个简单的问题,但是如果我将别名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"
用于显示字符串别名的示例,否则我只能将其婴儿床……我认为这很奇怪,除非我缺少明显的内容。
答案 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