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

时间:2018-09-24 10:31:44

标签: scripting windbg

我在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)
}

1 个答案:

答案 0 :(得分:2)

WinDbg的内部脚本功能有些混乱。恕我直言,WinDbg并不是真正为此类任务设计的。如果您需要更复杂的脚本,请尝试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"