再谈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}.

执行情况如下:

  1. 不传参数
    0:000> $$>a<f:\1.wds
    第一个参数 ${$arg1}.
    第五个参数 ${$arg5}.
    第四个参数${$arg4}.
  2. 全部参数
    0:000> $$>a<f:\1.wds a b c d e f
    第一个参数 a.
    第五个参数 e.
    第四个参数d.
  3. 部分参数
    0:000> $$>a<f:\1.wds a b c d
    第一个参数 a.
    第五个参数 ${$arg5}.
    第四个参数d.
  4. 参数带空格
    先看没有空格的
    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

猜你喜欢

转载自www.cnblogs.com/yilang/p/12160623.html