如果系统进程运行在windows 2000上,则在不找出线程归属于哪个驱动程序或系统片段的情况下,你将无法对现行状况做出任何判断。如果线程起始地址碰巧落在操作系统映像(ntoss (?)kernel.exe)范围内的话,问题就可能有些复杂了。那么,你又能知道什么呢?你什么都知道不了。例如,我们来查看一下pstat输出。最靠前的设备驱动程序——它并不是一个真正的驱动程序,而只是操作系统自身——被在80400000处调用。如果我回到pviewer并选中系统进程——请注意,不是csr访问,而是系统,则该进程中的若干线程均从地址804附近启动。于是,我单击系统,请注意,当我向下滚动第一套线程时,多数线程的起始地址都在804附近。那么,这又告诉了我们什么呢?它告诉了我们该线程是nt的一个片段,但并未指明是nt的哪个片段,但有一点可以肯定,该线程是一个nt片段,而非一个驱动程序。如果你还想再往前走一步的话,这里有一个方法能将内存地址转化为子例程的名字,即通过将操作系统内核映像标识表格(或调试标识)进行转储的方式来实现,该方法由windows 2000用户诊测cd提供。这需要使用一个叫做内核调试器的工具,不过,我将不在本次讲座中予以演示,但如果你想了解执行这一附加步骤的方法,就请阅读windows nt第二版(该书在microsoft出版社网站上免费提供)第二章中关于如何转储ntoss内核标识并追踪系统线程地址以得到操作系统子例程名称的有关详细内容。
现在,让我们回过头来完成剩下的系统进程树。请记住,tlist/t为我们显示了这个树结构。这张幻灯片恰恰以图形方式展示了进程间的父子关系。接下来,让我们完成对剩余进程的描述。如果你查看tlist/t输出,会注意到第一个以.exe结尾的进程是smss,它代表会话管理器。这是第一个被创建的进程,并与系统剩余部分的装载有关。为了让你们能够查看tlist/t的输出,我将返回到命令行方式,并键入tlist/t。该会话管理器有两个孩子,即csr和winlogin。我们刚刚提及的csr是窗口操作系统的一个片段,当你看到下一张幻灯片时,会发现有两条关于为什么运行该进程的附加详细说明。csr并不是一个频繁运行的进程,它仅为小部分窗口系统请求而调用。如果你的系统中经常运行csr访问进程,则可能存在一或两个原因,这也是本子项目中的最后两部分——对字符应用程序(如命令行方式)进行的窗口管理和运行在终端窗口中的应用程序。上述应用程序由csr访问来处理。如果你运行16位的dos或windows 3.1应用程序,对该程序的某些支持则包括在csr访问中,但是,在常规的nt服务器或windows 2000 professional桌面系统中,该进程应是静止的。现在,让我们返回上一张幻灯片并完成剩余的进程树。
顾名思义,winlogon是一个登录进程。该进程提供了登录所需的类型控制和输入口令所需的对话框。当你输入用户名和口令时,winlogon将其发送给一个叫做lsass的子进程。如果你执行对服务器或工作站的本地登录,lsass进程将在安全数据库(亦即sam)中查对有关用户名和口令。由于网络登录服务运行在lsass子进程内,故如果你正在登录nt 4.0的域帐户,winlogon会将用户名和口令发送给运行在域控制器上的lsass子进程,而上述域控制器则存在于包含着你正在登录的帐号的域中。
现在,让我们回来看tlist/t的输出。在显示区域中,我们能看到winlogon的多少个子进程呢?两个,即服务控制器和lsass。让我们谈一谈服务控制器。什么是windows nt服务呢?一项服务就是服务器应用程序的一个片段,该应用程序通常被安装在注册表中、并将在系统引导时被服务控制器启动。如果我们转到下一张幻灯片,将会看到一张关于服务进程层次结构的图片。在一项服务被诸如sql server或extreme server等服务器应用程序添加至注册表中的情况下,当系统引导时,服务控制器将在注册表服务数据库中进行搜索,并创建一个从属图表(因为服务项目之间能够彼此依靠),进而以正确的顺序启动它们。如tlist/t输出所示,服务控制器有许多子进程,这些子进程则代表了可执行程序的映像,而这些可执行程序映像又包含着运行服务功能的服务器应用程序组件。现在,你将如何查看关于已安装服务的列表呢?我们依次单击开始/设置/控制面板,并点击windows 2000中的管理工具,在管理工具中,我们单击服务。目前得到的显示与你从windows nt 4.0中获得的较为相似,并伴有一些附带信息。例如,描述列就是windows 2000新添的信息。这就提供了一些额外的描述性文本来解释有关服务正在做着什么。查看关于各项服务部分详细属性的能力也是windows 2000的新特性。例如,我将向下滚动到脱机打印服务并单击鼠标右键,进而在出现的快显菜单上选择属性项目,接下来所显示出的属性之一就是可执行程序的路径。为什么说这一点很重要呢?原因就是,服务名并不总是直接映射到包含构成服务功能代码的可执行文件名上,换言之,如果你正在查看任务管理器并发现有一个服务进程正在运行着,则该项服务的可执行文件名也许并不能马上告诉你它到底是不是控制面板中所显示的那项服务功能。
让我们接着看下一张幻灯片,它显示了如何将你在系统中所看到的服务活动映射到在注册表中所定义的服务活动的途径。好的,我们刚才看到了如何将一个服务映射到可执行文件名的过程,但我们应如何执行这个过程的逆过程呢?tlist通过添加一个我们尚未使用过的参数——/s来解决这个问题。该参数所显示的内容是为那些包含服务的进程而设计的,正如我现在以白色加亮显示的运行于进程中的服务名那样。请注意,某些服务进程包含着象脱机打印那样的单项服务,而另一些则包含多项服务,而这就意味着在已知这些服务进程正在运行哪项服务的前提下,仍旧难以解释cpu时间的占用问题,但你毕竟已将该问题收缩到一个更小的范围内了。请记住,在第三列中所显示的名字并不是你在控制面板中所看到的那些,因为,服务实际上有三个名字:系统管理员在控制面板中所看到的名字、包含该服务的可执行文件的名字以及注册表中的服务名。tlist所显示的是注册中的服务名。因此,如果你进入注册表并查看服务列表(该列表存在于h键本地机当前控制服务中),那就是你能够按字母顺序查看的注册表键名。在这个注册表键之下,便是你将在控制面板中看到的显示名称以及可执行文件的名称。因此,有了tlist/t这个工具,你将至少能在一定程度上对这些服务进程中的某一个进程是否正处于运行状态做出判断,而恰恰是一个或多个服务导致了对cpu时间的占用。
我们最后一节的内容涉及在进程崩溃时观察其反常的进程活动。没有人愿意看到应用程序崩溃的情况,但我相信你们中的所有人至少都看到过屏幕上半部分显示的内容——著名的dr. watson程序产生的消息框。现在,我们所看到的实际上是在windows 2000中更新过的dr. watson消息框,它比nt 4.0中同样的消息框少了一点信息。windows nt 4.0在该消息框中显示应用程序崩溃的原因。并且将其标注为dr. watson。现在它仅被标注为应用程序错误并且添加了一些nt 4.0中没有的帮助性文字,主要包括“你需要重新启动程序”这句话。虽然大多数用户都知道应当这样做,但这个消息框还是更清楚的指明了应用程序的崩溃。你需要重新启动程序。不幸的是,它依旧没有告诉用户对于应用程序的崩溃可以做些什么。它仅显示了一条产生出来的出错日志记录。那么,这个出错日志记录在哪里以及针对其做了些什么呢?这正是我们将在这一节中考虑的问题。
首先,如何导致一个进程崩溃呢?产生一个不可处理的异常,例如引用一个非法的内存地址、或被0除。大多数windows nt 4.0和windows 2000系统被配置为在应用程序出错时运行dr. watson。注册表中的ae debug键指示了调试器的名称,该键位于软件分支中。如果找到该注册表键,你会发现在大多数情况下它被配置为调试器dr. watson,dr. watson并非一个真正的调试器,而只是一个在进程崩溃时产生信息快照的事后工具。如果你已经安装了visual studio或一些其它的开发工具,注册表可能已经被修改,不再使用dr. watson,取而代之,以visual studio开发环境为例,当进程崩溃时,你将会看到屏幕下方显示的针对程序员的消息框,其中包括了有关异常的详细信息并且给程序员一个退出程序或运行调试器的选项。但在大多数情况下,还是会显示上面的消息框。
一个程序崩溃时会发生什么呢?首先,让我们产生一个这样的情况并看一看它的结果。让我们回到命令行方式并在演示目录中运行一个将立即导致访问违规的程序,该程序中引用了0地址这样一个非法地址。一个由dr. watson产生的消息框显示出来,并且同时创建了一条出错日志记录,我们还不知道它来自何处,因此,单击确定。下面,我们将通过交互地运行dr. watson工具来确定出错日志记录的位置。我将运行drwtsn32,它是组成dr. watson工具的程序名称。当交互运行dr. watson工具时,它显示一个配置对话框以告诉你日志文件和故障转储文件的位置,尽管在消息框中没有提到,但可以看出故障转储文件显然是被创建的。windows nt 4.0和windows 2000中的缺省动作是为dr. watson创建一个日志文件和一个故障转储文件。其中命名为user.dmp的故障转储文件包含死亡进程私有内存空间中的内容。日志文件中包含了不知是否对程序员有所帮助的文本信息。user.dmp文件包含了进程的精确状态。换言之,它包含了进程死亡时沙箱中的脏沙子。转储文件可被程序员应用于一个称为windbg的工具或windows调试器中,以便观察进程崩溃时的状态,这将有希望能够调试或诊断问题。现实中,对于每个崩溃的进程,都应向程序所有者发送一个user.dmp文件。例如,如果outlook崩溃了,并且是一个未知的问题,那么应向microsoft发送一个转储文件。如果是一个第三方软件,那么应向其厂商发送一个user.dmp文件。转储文件每次使用时都将被覆盖,与此相反,日志文件缺省时是被追加的。日志文件将保存所有进程崩溃的跟踪信息,不幸的是,user.dmp文件每一次都将被覆盖。因此,除非使用某些机制或保证用户已被培训为能够定位和重命名文件,否则,只有最近的死亡进程信息将被保留。
当前所说的不是由系统崩溃产生的nt核心故障转储,而是一个进程崩溃产生的转储文件。不同的工具将用于观察这两种转储文件。最基本的,如果你的用户遇到了一个dr. watson错误或程序错误,某个人应当获取转储文件并尽快将其转移到他自己的系统中,改变其名称并将其送往厂商。
另一个与系统崩溃有关的工具是作为调试工具的一部分新添加到windows 2000中的称为增强用户转储工具的程序。该工具将在从用户诊断cd中安装调试工具时被安装。该工具可以完成而dr. watson目前尚不能实现的功能是,在不影响进程的情况下为一个挂起的正在执行中的进程生成一个user.dmp文件。现在,如果有一个挂起的程序,并且你唯一的选择是杀死这个进程。这种情况下,也有一种获得内存快照的方法,以使你能够将其发送给厂商并期望问题得以解决。这种方法是配置成从命令行状态或通过预定义的快捷键(这在不能切换到命令行状态时非常有用)运行该工具。为了获取更多信息,可以参考windows 2000调试工具的帮助文件。
以上是有关理解windows nt 4.0和windows 2000系统及进程活动的内容。我希望通过我们已经看到的这些手头的工具,在系统运行缓慢或不知何故出现故障时,你能够深入到进程或系统活动内部并查明cpu时间究竟耗费在了什么地方以及为什么会这样。
想要获得更多信息,在technet网站上的文章中可以得到大量有关nt故障诊断的信息。当然,windows 2000的microsoft官方课程也很