WinDbg具有.if语句用于条件执行命令:
.if (Condition) { Commands } .else { Commands }
Run Code Online (Sandbox Code Playgroud)
对于Condition,不可能使用WinDbg命令.是否存在使用命令进行条件的间接方式,例如通过伪寄存器?
要完成的示例任务:如果已打开日志文件,则不执行任何操作.如果没有打开日志文件,请使用.logopen/t/u/d
使用.logfile,我可以查看日志是否打开.但是如何解析该输出以及如何将结果分配给伪寄存器?
任何其他没有伪寄存器的方式也是受欢迎的.
由于示例可能看起来不太有用,请考虑以下可通过脚本或.cmdtree窗口自动执行的任务:
.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 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