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

标签 windbg

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}

最佳答案

我对此进行了测试,如果在模块列表中找到 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 附加名称: C:\Windows\system32\calc.exe

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

.foreach/pS 6 ( token {|}) {.echo ${token}; .if($spat("${token}","*calc.exe") == 1) {.echo 找到我的应用程序;.childdbg 1} .else {.echo 找不到我的应用程序} }

也经过测试并有效。

ps。我的调试器版本是6.2.8400.0

关于WinDbg:使用 .if 中的条件命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20069961/

相关文章:

debugging - 未知的应用程序域

debugging - WinDBG 查看传递给任何函数的参数

c# - LOH 碎片 - 2015 年更新

debugging - 为 Windows 服务设置事后调试器

debugging - 崩溃转储和挂起转储之间的区别?

windbg - 强制 WinDbg 加载已卸载模块的符号

internet-explorer - IE 挂起 100% CPU/Got 堆栈跟踪

windows - 使用 vmware 机器进行内核调试

.net-4.0 - w3wp.exe 崩溃 - ThreadAbortException