这是微软提供的一个windbg JavaScript插件例子
启动notepad.exe,cdb附加之,如果一切正常的话,应该这样测试插件
说说这个插件的原始意图。针对所有线程查看调用栈回溯
在调用栈回溯信息中寻找"__mainCRTStartup",定位相应线程的相应栈帧,在该栈帧上查看局部变量
> ~0s
> .frame /c 3
> dv
它假设notepad.exe的PDB文件保留了局部变量,比如StartupInfo;实际上这些信息只可能出现在私有PDB中,上面的dv不会显示任何内容。
> dt *!*STARTUPINFO
combase!LPSTARTUPINFO
combase!STARTUPINFO
urlmon!LPSTARTUPINFO
urlmon!STARTUPINFO
uxtheme!LPSTARTUPINFO
uxtheme!STARTUPINFO
wintypes!LPSTARTUPINFO
wintypes!STARTUPINFO
> dt combase!STARTUPINFO lpTitle
+0x018 lpTitle : Ptr64 Wchar
如果有StartupInfo,会从中析取lpTitle成员。微软写文档的人应该使用了私有PDB,否则只会得到报错
关于无法获取notepad.exe局部变量,另有方案交叉印证
没有任何输出。插件关于"__mainCRTStartup"的假设并不总是成立,比如Win7中的notepad.exe,入口函数并不是它。测试该插件时发现一个引擎BUG
"dx Debugger.State.Scripts"表明插件未被成功卸载,".scriptlist"已经啥都看不到了。重新加载插件,有异常现象:
"dx Debugger.State.Scripts"显示多出一个"TitleFinder_1",且只能用它
要想彻底恢复正常,只能卸载jsprovider.dll并重新加载之。测试对象是10.0.15063.468版x64 windbg。我居然好心地给windbg成员写邮件反馈了。原因是我在学"英语流利说",不写白不写。
周期性吐槽,微信订阅号只能当RSS用,截图是因为无法排版。感兴趣者请在PC上用浏览器查看原文。