windbg jsprovider.dll的一个BUG

这是微软提供的一个windbg JavaScript插件例子:

启动notepad.exe,cdb附加之,如果一切正常的话,应该这样测试插件:

说说这个插件的原始意图。针对所有线程查看调用栈回溯:

在调用栈回溯信息中寻找”__mainCRTStartup”,定位相应线程的相应栈帧,在该栈帧上查看局部变量:

它假设notepad.exe的PDB文件保留了局部变量,比如StartupInfo;实际上这些信息只可能出现在私有PDB中,上面的dv不会显示任何内容。

如果有StartupInfo,会从中析取lpTitle成员。

从MSDN的描述看,对于notepad.exe,析出来的lpTitle应该是可执行文件名。微软演示插件效果时,确实看到”C:\Windows\System32\notepad.exe”。微软写文档的人应该使用了私有PDB,否则只会得到报错:

> dx Debugger.State.Scripts.TitleFinder.Contents.FindTitleWithLINQ()
Error: Unable to get property ‘lpTitle’ of undefined or null reference

关于无法获取notepad.exe局部变量,另有方案交叉印证:

没有任何输出。

插件关于”__mainCRTStartup”的假设并不总是成立,比如Win7中的notepad.exe,入口函数并不是它。

测试该插件时发现一个引擎BUG:

“dx Debugger.State.Scripts”表明插件未被成功卸载,”.scriptlist”已经啥都看不到了。

重新加载插件,有异常现象:

“dx Debugger.State.Scripts”显示多出一个”TitleFinder_1″,且只能用它:

要想彻底恢复正常,只能:

测试对象是10.0.15063.468版x64 windbg。

发表评论