分类 调试 下的文章

 

 

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, thenthe loaded symbol is tested.
Otherwise,
if a pdb or dbg symbol filepath is specified, it is tested
against the loaded module.

保护总是好的,公司有两台符号服务器。其中一个已不再使用,但为以前发布的项目保留了符号。因为PDB文件和源代码一样重要,所以想知道是否有办法将符号服务器合并在一起。

由于符号服务器是用作数据库的文件系统,存储方案为\ServerShareFile.PDBGUIDFile.PDB,因此可以将资源管理器中的文件从一个符号服务器拖到另一个符号服务器。这并不理想,因为如果您正在积极地管理符号服务器来修剪死符号,那么那些通过拖放添加的符号将永远停留在那里。为了避免死符号问题,您只需要运行同一个命令,该命令使构建以SYMSTORE.EXE开始,SYMSTORE.EXE是Windows调试工具(也称为WinDBG)的一部分,可以作为Windows SDK的一部分安装。

symstore add /r /f \\Retiring\Share /s \\Combined\Share /t "Merging Symbol Servers"

windbg是一个内核模式和用户模式调试器,包含在Windows调试工具中。在这里,提供个实践练习,帮助我们开始使用windbg作为用户模式调试器。

用WinDbg调试记事本

1、导航到安装目录,然后打开windbg.exe。

2、在“文件”菜单上,选择“打开可执行文件”。在“打开可执行文件”对话框中,导航到包含notepad.exe的文件夹(例如,C:\windows\system32)。输入notepad.exe作为“文件名”。单击“打开”。

3、在windbg窗口底部附近的命令行中,输入以下命令:.sympath srv*.

输出:

符号搜索路径告诉windbg在哪里查找符号(pdb)文件。调试器需要符号文件来获取有关代码模块(函数名、变量名等)的信息。
输入此命令,通知windbg执行符号文件的初始查找和加载:.reload

4、查看notepad.exe模块的符号

请输入以下命令:x notepad!*

注意:如果看不到任何输出,请输入.reload。要查看包含main的notepad.exe模块中的符号,请输入以下命令: x notepad!*main*

5、在记事本上设置断点notepad!WinMain,输入以下命令:bu notepad!WinMain

要验证是否设置了断点,请输入以下命令:bl

6、运行,请输入以下命令:g

记事本一直运行到winmain函数,然后中断到调试器。

要查看在记事本进程中加载的代码模块列表,请输入以下命令:lm

 

要查看堆栈跟踪,请输入以下命令:k

7、再次运行 g

8、要中断记事本执行,请从“调试”菜单中选择“中断”。

9、观察保存过程,要在zwwritefile处设置和验证断点,请输入以下命令:

bu ntdll!ZwWriteFile

bl

10、输入g重新开始运行记事本。在记事本窗口中,输入一些文本,然后从“文件”菜单中选择“保存”。当涉及zwCreateFile时,正在运行的代码将中断。输入k以查看堆栈跟踪。

在windbg窗口的命令行左侧,注意处理器和线程号。在本例中,当前处理器编号为0,当前线程编号为15。因此,我们正在查看线程151的堆栈跟踪(它恰好运行在处理器0上)。

COM可见的.Net对象由标准COM调用实例化,例如CoCreateInstance。COM在注册表或激活上下文中找到CLSID,加载并调用mscoree.dll,该dll继续激活CLR和创建对象的过程。在此过程中,可能会出现错误0x80131700“未能加载运行时”或0x8013101b“此程序集是由比当前加载的运行时更新的运行时生成的,无法加载”。
这两条消息都是运行时版本不匹配的结果。0x80131700并不一定意味着任何损坏,它只是意味着无法加载运行时。可能是因为未安装,或者未安装所需的版本。0x8013101b表示加载了运行时,但结果与继续处理所需的版本不匹配。
让我们考虑Manifest Maker附带的Visual Studio示例。这里的本机主机程序是cmdEXE.exe,.Net对象是在clrDLL.dll中实现的。在本例中,我们重建了项目,而没有在DLL中嵌入CLR清单。因此,我们在子文件夹clrDLL\clrDLL.DLL中有clrDLL.manifest文件和DLL。当我们现在执行“cmdEXE.exe clr”时,程序使用CoCreateInstance实例化clr对象:

clrDLL::IClrSampleClassPtr scp;
HRESULT hr
=scp.CreateInstance(__uuidof(clrDLL::ClrSampleClass), nullptr, CLSCTX_INPROC_SERVER);if (S_OK !=hr)
{
wprintf(L
"\nCLR class instantiation failed, hresult = 0x%08X\n", hr);returnhr;
}