当我在别人的机器上调试问题时,我做的第一件事就是查看modules窗口。按版本排序并看到一个不属于的dll可以帮助立即诊断配置问题,并节省许多调试痛苦。
下面介绍下各列的意思:
- Name:
模块名称。 - Path:
PE在文件系统上的位置。当您希望找到正确的PE以开始使用命令行工具进行查询时,这非常有用。 - Optimized:这是针对托管代码的。它告诉您,当从MSIL转到目标平台本机指令集时,JIT编译器是否使用了优化。
- User Code:在调试器选项中,它也被称为“只是我的代码”。如果您刚刚打开了我的代码,并且dll已优化或没有符号,我们将把它视为“非用户”代码。这意味着调用堆栈窗口中的所有帧都将折叠到一个[非用户代码]帧之后。默认情况下,这个特性是关闭的C++,以及VB和C用户配置文件。您可以在Tools/options/Debugging/Enable-Just-My-Code下切换它。“JMC”的全部分支比简单地隐藏调用堆栈帧要大得多。它包括遍历非用户代码,一直到代码开始运行的地方(并且执行得很快)。Mike Stall在博客中提到了其中一些。
- Symbol Status:这将告诉您是否加载了符号。它还可以告诉您它们是否被剥离(实际上只是一个本地dll问题),或者devenv是否只是加载了导出。如果您正在执行崩溃转储调试,它还可以判断是否已找到二进制文件。右键单击上下文菜单,您可以加载符号,跳转到“符号设置…”对话框,还可以查看我们搜索符号的位置。
- Symbol File:pdb文件所在的位置。上下文菜单项“符号加载信息…”可以告诉您调试器查找符号的位置。
- Order:加载顺序
- Version: dll的版本信息。这对于将相关组件组合在一起非常有用,并且通常会在有人的版本不好时向您显示。查看我们在visual studio版本字符串中保留的信息量。
- Timestamp: 这是真正的交易-链接器(或.Net编译器)生成并将PE发送到世界上时的内部时间戳。
看看这个:
C:Program FilesInternet Explorer>dir iexplore.exe
Volume in drive C has no label.
Volume Serial Number is 2CAB-3E87
Directory of C:Program FilesInternet Explorer
08/04/2004 05:00 AM 93,184 IEXPLORE.EXE
文件系统的时间戳是什么。如果你想知道它什么时候落在你的硬盘上就好了。对于确定它比过程中的所有相关组件都晚2天构建来说,没有那么有用。
C:Program FilesInternet Explorer>dumpbin /headers IEXPLORE.EXE | findstr time
41107B81 time date stamp Tue Aug 03 23:00:33 2004
这是你真正想要的。好...这是我真正想要的。这就是你在这个专栏里看到的。在VS之前的版本中,托管代码的时间戳是不太有用的文件系统时间戳。 - Address:
进程内存中PE的加载地址范围。最左边是一列没有标题的图标。如果图标看起来像一个小页面,则此地址是首选加载地址。如果它有一个带有红色感叹号的页面,那么这个PE在加载时被重新定位。如果你拥有这个PE,找到一个它自己的地方,它可能加载得更快。 - Process:
进程名:其中之一(本机或托管)。注意:如果您正在进行混合模式调试,那么许多dll实际上会在“模块”窗口中有行。一个用于“本机”dll加载。。。在某种程度上,一切都是土生土长的。一个用于托管dll加载。您可以知道它们是同一个dll,因为地址范围将匹配。基名可能不匹配,因为有时NGen的dll显示时,名称中添加了“ni”扩展名。(例如Microsoft.Build.utilities.ni.dll。)
通过单击并拖动列,可以更改“模块”窗口中列的顺序。还可以通过拖动边框来调整列的大小。另一个巧妙的技巧是通过标题栏上的上下文菜单将窗口设置为选项卡式文档。你可以在devenv的任何一个窗口中完成这项工作。