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
所以它比";晚一个迭代,我理解这一点是因为.ho foo语句没有重新计算别名foo。因此,我将该语句括在一个语句块.Block{.echfoo}中
ad *; .foreach /s (var "aaa bbb ccc") { ;aS ${/v:foo} var; .block {.echo foo}}
现在它回显
aaa
bbb
ccc
正如预期和期望的那样。但是,我发现如果我只在语句.echfoo和块的右花括号(例如空格或分号)之间插入AddAny字符
ad *; .foreach /s (var "aaa bbb ccc") { ;aS ${/v:foo} var; .block {.echo var foo }}
然后我得到输出
aaa
aaa
bbb
所以我的问题是:
- 为什么会发生这种情况?我有一个语句块来强制重新评估别名,一个无害的字符如何才能有所不同?
- 即使额外的字符以某种方式破坏了预期/所需的别名替换,为什么不在第一次通过循环时这样做呢?如果中断,则输出应与第一个示例相同,第一次迭代生成";foo";而不是";aaa";。
- 如何才能按预期工作(每次循环时都会重新计算别名)?别名后面不能总是有右大括号,我可能需要在语句中间使用它。我尝试使用语法${foo},但没有改变任何内容。
我还尝试使用带有伪寄存器的.for循环,而不是带有字符串的.Foreach循环,结果与预期完全相同--如果且仅当我在语句.echfoo中的别名后面有右大括号时,结果才完全相同。
ad *; .for (r $t0=0; @$t0<3; r $t0=@$t0+1) {;aS /c ${/v:foo} r @$t0; .block{.echo foo}}
且结果相同-如果且仅当.echfoo后有右大括号时,别名计算才正确,否则将落后一位(除非第一次正确通过循环)。
此外,问题似乎不是别名定义语句本身作为${/v:foo}var。如果我在之后插入一个al命令作为${/v:foo},则会按预期列出别名。因此,问题出在使用.echfoo别名的语句中。只要它包含在语句块中,它就应该起作用。请帮帮忙!
谢谢, 戴夫
快速更新:我开始认为这是Winbg中的一个实际错误,尽管我看不出它是如何破坏循环中的别名的,这似乎是一个严重的错误。在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{},就可以按照文档所说的那样工作。但就像在我的示例中一样,在.eck值myAlias语句中的别名后面引入任何字符都会产生后面一个的输出(就像没有.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
这篇关于Windbg别名在循环中的奇怪行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!