我在 Windbg 脚本中使用 .do 循环,所有逻辑都运行良好。

在那个 .do 循环中,我正在做一个 .f+ 并且我已经使用 .outmask- 1 来抑制 .f+ 的喋喋不休,它向你回显帧,就像 23 00000002a9a2f7b0 0000000000000000 ntdll!RtlUserThreadStart+0x1d 。它现在可以遍历堆栈的帧,而无需将每个帧回显回命令行窗口。

但是,在使用 .outmask.outmask 1 重置 .outmask /d 时,以下行始终将 Client 00000000002873A0 mask is 3F7 回显到命令行窗口。

由于我处于一个循环中,我的目标是抑制 .f+ 的详细输出,因此我最不希望 .outmask 在该循环中同样健谈。有没有办法抑制它?

我的循环看起来像这样:

  .frame 0n0
  r $t0 = 0

  .do
  {
    !for_each_local .if ($spat ("@#Local","foo") == 1) { ?? foo->bar }

    .outmask- 1
    .f+
    .outmask 1
    r $t0 = @$t0+1
  }
  (@$t0 < @$t1)
}

最佳答案

WinDbg 的内部脚本功能有些困惑。恕我直言,WinDbg 并不是真正为此类任务而设计的。如果您需要更复杂的脚本,请尝试 pykdmdbgJavaScript Debugger Scripts (Microsoft)

防止某些东西输出的一般方法是

.foreach (output {<put your command here>}) {}

即在你的情况下
.foreach (output {.outmask 1}) {}

它将输出的每个单词作为变量 output 传递给循环,循环对它不做任何处理。

我希望您能够将其集成到您的脚本中,而不会产生任何其他副作用。

使用 $>a< 运行时,以下脚本对我有用:
.echo "Before"
.frame 0n0
r $t0 = 0
.do {
    !for_each_local .if ($spat ("@#Local","foo") == 1) { ?? foo->bar }
    .outmask- 1
    .f+
    .foreach (output {.outmask 1}) {}
    r $t0 = @$t0+1
}
(@$t0 < @$t1)
.echo "After"

关于scripting - Windbg - 可以抑制 .outmask 1 或 .outmask/d 的输出吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52477397/

10-11 07:04