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

问题描述 投票:1回答:1

我的目标是存储在框架的本地中找到的名为this的对象的类名。当你看看这个命令序列时,我是否违反了一些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} } } - 呸!!!

scripting alias windbg
1个回答
1
投票

扩展命令(!-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}
© www.soinside.com 2019 - 2024. All rights reserved.