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

Windbg script using as /c inside a .foreach, .if, !for_each_local

我的 objective 用于存储在框架的局部变量中找到的名为 this 的对象的 class 名称。当您查看这一系列命令时,我是否违反了某些 Windbg 语法规则,这些规则意味着 as 命令似乎不会引发任何错误,但 也不会 按照我的意愿设置别名?

这让我有点困惑,因为别名 明显设置在我之前使用的隔离 .foreach 命令中,现在我只是嵌套它(虽然我会还尝试 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}用起来就不行了。我试过 aS 和分号的组合无济于事,我 确定 这只是一个语法问题,这已记录在案,但我再也看不到木头了树。

上次尝试,我试过了 - !for_each_local .if ($spat ("@#Local","this") == 1) { .foreach /pS 1 /ps 4 (Token { dv /t this }) { as /c myClass .echo ${Token} } } - 呸!!!

扩展命令(!-commands;bang-commands)通常不能很好地与别名一起使用。

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

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}