首页 > 解决方案 > Windbg 脚本在 .foreach、.if、!for_each_local 中使用 as /c

问题描述

this我的目标是存储在框架的局部变量中找到的对象的类名。当您查看此命令序列时,我是否违反了一些 Windbg 语法规则,这意味着该as命令似乎没有引发任何错误,但也没有按照我的意愿设置别名?

这让我有点困惑,因为别名显然是在我之前使用的隔离.foreach命令中设置的,现在我只是将它嵌套(尽管我也尝试过as /c与 a 结合.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}愉快地使用,但我不能使用aswith ${Token}。我尝试了aS和分号的组合但无济于事,我确信这只是一个语法问题,这已记录在案,但我再也看不到树木的木材了。

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

标签: scriptingaliaswindbg

解决方案


扩展命令 ( !-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}

推荐阅读