再谈Windbg脚本装载指令
装载指令和文件路径前的空格问题
单个$装载的
-
$<filename
-
$><Filename
此两种方式,要求文件路径和前面的标识符紧贴,不允许有空格。
示例如下:
0:000> $<f:\1.wds 0:000> .echo hello windbg hello windbg 0:000> $< f:\1.wds Command file execution failed, Win32 error 0n123 "文件名、目录名或卷标语法不正确。" 0:000> $><f:\1.wds hello windbg 0:000> $>< f:\1.wds Command file execution failed, Win32 error 0n2 "系统找不到指定的文件。"
两个$装载的
-
$$<filename
-
$$><Filename
支持Filename之前带空格
示例如下:
0:000> $$<f:\1.wds 0:000> .echo hello windbg hello windbg 0:000> $$< f:\1.wds 0:000> .echo hello windbg hello windbg 0:000> $$><f:\1.wds hello windbg 0:000> $$>< f:\1.wds hello windbg
所以,建议用$$
脚本参数传递问题
使用形式如下:
$$>a< Filename [arg1 arg2 arg3 ... ]
argn:指定任意数目的参数,用于调试器传送给脚本,在执行脚本文件之前,脚本文件中任意${$argn}格式的字符串,对应被调试器传送进来的argn替换,
参数中不能包括引号或分号,多个参数应该用空格来分隔开,如果一个参数包含了空格,那么就用引号把它括起来,你可以使用任意多的参数,如果这个参数没被传入,就直接显示${$arg1}
看如下脚本:
.echo 第一个参数 ${$arg1}. .echo 第五个参数 ${$arg5}. .echo 第四个参数${$arg4}.
执行情况如下:
- 不传参数
0:000> $$>a<f:\1.wds 第一个参数 ${$arg1}. 第五个参数 ${$arg5}. 第四个参数${$arg4}.
- 全部参数
0:000> $$>a<f:\1.wds a b c d e f 第一个参数 a. 第五个参数 e. 第四个参数d.
- 部分参数
0:000> $$>a<f:\1.wds a b c d 第一个参数 a. 第五个参数 ${$arg5}. 第四个参数d.
- 参数带空格
先看没有空格的
0:000> $$>a<f:\1.wds ab bc cd de ef 第一个参数 ab. 第五个参数 ef. 第四个参数de.
带空格不加引号
0:000> $$>a<f:\1.wds ab bc cd de e f 第一个参数 ab. 第五个参数 e. 第四个参数de.
带空格加引号
0:000> $$>a<f:\1.wds ab bc cd de "e f" 第一个参数 ab. 第五个参数 e f. 第四个参数de.
其他
$$>a< script文件参数中带空格:那么就把它用双引号括起来,这同样适用于Filename
0:000> $$>a< C:\Program Files\1.wds 1 2 3 4 Command file execution failed, Win32 error 0n2 "系统找不到指定的文件。" 0:000> $$>a< "C:\Program Files\1.wds" 1 2 3 4 The first argument is 1. The fifth argument is ${$arg5}. The fourth argument is 4.
如果使用$<或$><,你不能在Filename之前加任意空格,你也不能使用引号把Filename括起来,你也不能在这个命令后加分号或其他命令!
0:000> $><f:\1.wds The first argument is ${$arg1} The fifth argument is ${$arg5} The fourth argument is ${$arg4} 0:000> $>< f:\1.wds Command file execution failed, Win32 error 0n2 "系统找不到指定的文件。" 0:000> $>< "f:\1.wds“; Command file execution failed, Win32 error 0n2 "系统找不到指定的文件。" 0:000> $><c:\1.txt;r eax Command file execution failed, Win32 error 0n2 "系统找不到指定的文件。"
如果你使用$$<或><,那么Filename之前可以不带空格,你能在这个命令之后使用一个分号或其他命令,你可以选择Filename使用引号括起来,但不是必需的,即使Filename中含有空格或同一行中有其他命令(这个前面肯定要带分号来分隔不同命令):
0:000> $$> f:\1.wds The first argument is ${$arg1} The fifth argument is ${$arg5} The fourth argument is ${$arg4} 0:000> $$><f:\1.wds The first argument is ${$arg1} The fifth argument is ${$arg5} The fourth argument is ${$arg4} 0:000> $$><"f:\1.wds" The first argument is ${$arg1} The fifth argument is ${$arg5} The fourth argument is ${$arg4} 0:000> $$><f:\1.wds; r ebx The first argument is ${$arg1} The fifth argument is ${$arg5} The fourth argument is ${$arg4} ebx=00000000
也就是><或<会把分号之前(如果没有分号就是整行)都当成Filename。
$< 和$$<关键字逐个执行脚本文件中的命令(多个命令就是一个一个命令输出)。
$><和$$><关键字打开脚本文件,将所有回车替换为分号,然后将转换后的文本当作单个命令块来执行。这些关键字在运行包含调试器命令程序的脚本时非常有用。
注意是<和><的区别
把1.wds改成如下:
.echo cmd1
.echo cmd2
执行:
0:000> $<f:\1.wds 0:000> .echo cmd1 cmd1 0:000> .echo cmd2 cmd2
0:000> $><f:\1.wds cmd1 cmd2