WinDbg:在.if中使用命令

时间:2013-11-19 11:12:54

标签: windbg

WinDbg具有.if语句,用于条件执行命令:

   .if (Condition) { Commands } .else { Commands } 

对于Condition,无法使用WinDbg命令。是否存在使用命令进行条件的间接方式,例如通过伪寄存器?

要完成的示例任务: 如果已打开日志文件,则不执行任何操作。如果没有打开日志文件,请使用 .logopen / t / u / d

使用 .logfile ,我可以查看日志是否打开。但是如何解析该输出以及如何将结果分配给伪寄存器?

也欢迎没有伪寄存器的任何其他方式。

由于示例似乎不太有用,请考虑以下可通过脚本或.cmdtree窗口自动执行的任务:

  • 加载正确版本的SOS,例如.if (lm m clr == clr) { .loadby sos clr } .elseif (lm m mscorwks == mscorwks) {.loadby sos mscorwks}
  • 我总是忘记做的事情,例如.if (| == myprocess) {.childdbg 1; .sympath+ mydir}

1 个答案:

答案 0 :(得分:5)

我对此进行了测试,如果在模块列表中找到clr,它会加载正确的sos.dll: .foreach (module {lm1m} ) { .if ($sicmp("${module}","clr") == 0) {.echo FOUND ${module}; .loadby sos.dll clr} }

您可以使用.elsif轻松扩展它,并将模块与“mscorwks”进行比较。

至于检查你的过程,我附加到calc.exe并运行了|,它给了我:. 0 id: 6bc attach name: C:\Windows\system32\calc.exe

我只想要最后一个令牌,所以我可以通过将/ pS 6指定为.foreach来跳过前六个。以下使用* calc.exe的通配符比较,如果找到,则告诉调试器调试子进程:

.foreach /pS 6 (token {|}) {.echo ${token}; .if($spat("${token}","*calc.exe") == 1) {.echo FOUND MY APP;.childdbg 1} .else {.echo FAILED TO FIND MY APP} }

也经过测试和工作。

PS。我的调试版本是6.2.8400.0

相关问题