WinDbg:使用.if中的条件命令

4

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

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

对于条件,无法使用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个回答

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来跳过前六个。以下示例使用通配符比较*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}} 同样经过测试可行。
附:我的调试器版本为6.2.8400.0

太棒了。这些命令指引我到目前为止不知道的所有必要命令,以便我可以进行大量自动化。它也适用于日志文件: .foreach /ps 4 (token {.logfile}) {.if ($spat("${token}","No") == 1) {.logopen /t /u /d}} - Thomas Weller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接