Windbg别名在循环中的奇怪行为 [英] Strange behavior of windbg alias in loops

查看:12
本文介绍了Windbg别名在循环中的奇怪行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试掌握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

所以我的问题是:

  1. 为什么会发生这种情况?我有一个语句块来强制重新评估别名,一个无害的字符如何才能有所不同?
  2. 即使额外的字符以某种方式破坏了预期/所需的别名替换,为什么不在第一次通过循环时这样做呢?如果中断,则输出应与第一个示例相同,第一次迭代生成";foo";而不是";aaa";。
  3. 如何才能按预期工作(每次循环时都会重新计算别名)?别名后面不能总是有右大括号,我可能需要在语句中间使用它。我尝试使用语法${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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆