windbg 别名在循环中的奇怪行为

Strange behavior of windbg alias in loops

我正在尝试掌握 windbg 别名(例如 aS 命令)并将 运行 变成我无法理解的行为。这是一个令人讨厌的问题(至少对我而言),我很想理解它,所以非常感谢您的帮助。

总的来说,我认为我理解别名评估过程(例如,需要一个新的语句块来强制进行新的评估)。

我已将问题归结为以下陈述。第一个:

ad *; .foreach /s (var "aaa bbb ccc") { ;aS ${/v:foo} var; .echo foo}

这输出

foo
aaa
bbb

所以这是我理解的“落后一次迭代”,因为语句 .echo foo 没有别名 foo re - 评估。所以我将该语句包含在一个语句块中,.block {.echo foo}

ad *; .foreach /s (var "aaa bbb ccc") { ;aS ${/v:foo} var; .block {.echo foo}}

现在回显了

aaa
bbb
ccc

符合预期和期望。但是我发现如果我只是在语句 .echo foo 和块的右花括号之间插入添加 any 字符(例如空格或分号)

ad *; .foreach /s (var "aaa bbb ccc") { ;aS ${/v:foo} var; .block {.echo var foo }}

然后我得到输出

aaa
aaa
bbb

所以我的问题是:

  1. 为什么会这样?我有一个强制别名重新评估的语句块,一个无害的字符怎么会有所不同?
  2. 即使额外的字符以某种方式破坏了 expected/desired 别名替换,为什么它在第一次循环时不这样做?如果它被破坏,输出应该与第一个例子相同,第一次迭代产生“foo”而不是“aaa”。
  3. 我怎样才能使它按预期工作(每次循环都对别名进行重新评估)?我不能总是在别名后面有一个右大括号,我可能需要在语句中间使用它。我尝试使用语法 ${foo} 但这并没有改变任何东西。

我还尝试使用带有伪寄存器的 .for 循环而不是带有字符串的 .foreach 循环,结果完全相同 - 与 expected/desired 当且仅当我在语句 .echo foo.

中的别名后有一个右括号时
ad *; .for (r $t0=0; @$t0<3; r $t0=@$t0+1) {;aS /c ${/v:foo} r @$t0; .block{.echo foo}}

并且结果相同 - 别名评估正确当且仅当在 .echo foo 之后有右花括号时,否则它是一个在后的(除了正确时第一次通过循环)。

此外,问题似乎不是别名定义语句本身 aS ${/v:foo} var。如果我在 aS ${/v:foo} 之后插入 al 命令,那么别名会按预期列出。所以问题出在 使用 别名 .echo foo 的语句中。只要它包含在语句块中,它就应该可以工作。请帮忙!

谢谢, 戴夫

快速更新:我开始认为这是 windbg 中的一个实际错误,尽管我不明白这是怎么回事,因为它打破了循环中的别名,这似乎是一个重要的错误。在 MS 文档中 https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/using-aliases有个例子和我上面给出的基本一样:

ad *
.foreach (value {dd 61000 L4}) 
{
  as /x ${/v:myAlias} value + 1
  .block{.echo value myAlias }
}

只要 .block{} 存在,这就会像文档中所说的那样工作。但是就像在我的示例中一样,在语句 .echo value myAlias 中的别名后面引入 any 字符会产生一个落后的输出(只是就好像没有 .block{}),除了第一次迭代。因此,文档中的这个示例起作用的唯一原因是它恰好在别名 myAlias 后跟一个大括号。

删除末尾的别名:

2:007> .foreach /s (var "aaa bbb ccc") { ;aS ${/v:foo} ${var}; .block { .echo ${var} ${foo} and so }; ad ${/v:foo}}
aaa aaa and so
bbb bbb and so
ccc ccc and so

以广告*开头;如果没有以前定义的别名会出错你确定它没有别名吗?按照 Thomas 的回答操作,使用后删除别名。

尝试使用类似这样的东西

0:000> .foreach /s (var "sugar honey tea lemongrass  ginger") {;aS ${/v:foo} var; .block{.echo my foo is mixed with milk ;ad *}  }
my sugar is mixed with milk
my honey is mixed with milk
my tea is mixed with milk
my lemongrass is mixed with milk
my ginger is mixed with milk
0:000>