在.foreach,.if,!for_each_local中用作/ c的Windbg脚本

时间:2019-04-03 10:29:45

标签: scripting alias windbg

我的目标是存储在框架本地中找到的名为this的对象的类名。当您查看此命令序列时,是否被某些Windbg语法规则所污染,这意味着as命令似乎没有引发任何错误,但是没有设置了我想要别名吗?

这让我有些困惑,因为在我先前使用的隔离.foreach命令中明显地设置了别名 ,现在我只是嵌套了它(尽管我也尝试过{{1 }}再加上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}和分号的组合都无济于事,我确定这只是一个语法问题,已被记录在案,但我再也看不到树木的木头了。 / p>

最后一次尝试,我尝试过-aS-ba !!!

1 个答案:

答案 0 :(得分:1)

扩展命令(!-命令; bang-command)通常不适用于别名。

您可以使用简化的命令进行尝试:

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}