我在 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)
}
最佳答案
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"
关于scripting - Windbg - 可以抑制 .outmask 1 或 .outmask/d 的输出吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52477397/