Windbg - 可以抑制 .outmask 1 或 .outmask /d 的输出吗?

Windbg - possible to suppress output for .outmask 1 or .outmask /d?

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

在那个 .do 循环中,我正在做一个 .f+ 并且我使用 .outmask- 1 来抑制 .f+ 的喋喋不休,它将帧回显到你,就这样23 00000002a9a2f7b0 0000000000000000 ntdll!RtlUserThreadStart+0x1d。它现在可以围绕堆栈的帧进行迭代,而无需将每个帧回显到命令 Window.

然而,在 重置 .outmask .outmask 1.outmask /d 以下行总是回显 Client 00000000002873A0 mask is 3F7 到命令 Window.

当我处于一个循环中时,我的 objective 是为了抑制 .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 并不是真正为此类任务设计的。如果您需要更复杂的脚本,请尝试 , or JavaScript 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"