我在 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"