【问题标题】:WinDbg: using commands for the condition in .ifWinDbg:对 .if 中的条件使用命令
【发布时间】:2013-11-20 06:00:53
【问题描述】:

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}

【问题讨论】:

    标签: windbg


    【解决方案1】:

    我对此进行了测试,如果在模块列表中找到 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

    【讨论】:

    • 太棒了。这为我指出了迄今为止我不知道的所有必要命令,以便我可以进行大量自动化操作。它也适用于日志文件: .foreach /ps 4 (token {.logfile}) {.if ($spat("${token}","No") == 1) {.logopen /t /u / d}}
    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 2016-07-29
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多