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



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

在那个.do循环中,我正在做一个.f+,我用.outmask- 1来抑制.f+的喋喋不休,它像23 00000002a9a2f7b0 0000000000000000 ntdll!RtlUserThreadStart+0x1d一样将框架回响给你。它现在可以循环访问堆栈的帧,而无需将每个帧回显到命令窗口。

但是,在使用.outmask 1.outmask /d重置.outmask时,以下行始终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 并不是真正为此类任务而设计的。如果您需要更复杂的脚本,请尝试 pykd、mdbg 或 JavaScript 调试器脚本 (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"

最新更新