我在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)
}
答案 0 :(得分:2)
WinDbg的内部脚本功能有些混乱。恕我直言,WinDbg并不是真正为此类任务设计的。如果您需要更复杂的脚本,请尝试pykd,mdbg或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"