未记录的WinDBG扩展命令---itoldyouso
DBGHELP.DLL中有一些文档化的WinDBG扩展命令,例如!sym and !dh,分别设置符号加载诊断和转储模块PE头。看到itoldyouso是小写的,我不禁怀疑它是否是一个未经文档化的WinDBG扩展命令。启动WinDBG并输入!itoldyouso,产生了以下结果:
0:000> !itoldyouso !IToldYouSo <module> [symbol] !IToldYouSo tests the validity of a module against a symbol file. The module can be specified by either its name or base address. If a symbol file is not specified, then the loaded symbol is tested. Otherwise, if a pdb or dbg symbol file path is specified, it is tested against the loaded module.
真漂亮!如果一个模块有几个.PDB文件,可以使用!itoldyouso (或者!chksym,它执行相同的操作)以查看哪一个是完全匹配的。顺便说一句,如果没有与特定二进制文件匹配的PDB符号,可以使用.symopt(设置符号选项)命令强制WinDBG加载任何符号,并将0x40作为选项传递。将SYMOPT_LOAD_ANYTHING标志设置为符号加载器。请注意,Visual Studio将只加载完全匹配的PDB符号,并且无法更改该行为。
在上面的屏幕截图中,您可能会看到一些其他未记录的WinDBG扩展命令。如果您看过DBGHELP.DLL文档,您会发现其中一些名称与Microsoft符号格式有关。几乎所有由DBGHELP.DLL导出的未记录命令看起来都是为了帮助WinDBG开发人员调试符号处理或堆栈遍历。
只有一个命令对我们这些凡人开发者有用!lmi,它在命令行中使用模块名,并在模块和加载的符号文件上生成详细输出。
为虫子生,为虫子死,为虫子奋斗一辈子