调试分布式 Web 应用程序 (1)

 

Anand Rajagopalan
开发专家
电子商务主要支持团队
Microsoft Corporation
2000年8月

摘要:深入介绍了用于调试分布式 Web 应用程序的各种工具。目的是在一个基于 Web 的开发环境中,用 Internet Information Services (IIS) Active Server Pages (ASP) 来调试中间层的 Component Object Model (COM) 组件。

目录



前言

本文重点

这篇文章将帮助您理解用来调试分布式 Web 应用程序的各种工具。在一个基于 Web 的开发环境中,用 Microsoft® Internet Information Services (IIS) Active Server Pages (ASP) 来调试中间层 Component Object Model (COM) 组件。阅读完本文后,用户应该能够:

  • 了解 IIS 的体系结构。

  • 了解联机处理的应用程序、脱机处理的应用程序和共享的应用程序这些术语,并说明它们各自的优缺点。

  • 了解如何使用 Exception Monitor 监视 IIS 应用程序和 COM 组件。

  • 了解如何使用 User Dump 将进程的内存转储到磁盘并对其进行检查。

  • 了解如何使用 WinDBG 来调试一个实时的进程。

  • 了解如何使用性能监视器解决 100% 的 CPU 问题。

  • 了解如何使用 Console-Based Debugger (CDB) 和 Microsoft® Windows NT® Symbolic/Systems Debugger (NTSD)。

面向的读者

在读完本文后,开发人员、技术支持人员以及从事网站开发和维护工作的 Web 管理人员将对 IIS 的体系结构和调试过程有一个更好的了解。



简介

Internet Information Server 的体系结构

要了解调试组件的过程,必须首先对 IIS 的体系结构有一个很好的认识。下图将有助于您理解 IIS、ASP、Internet Server Application Programming Interface (ISAPI) 和组件之间的关系。

图 1. Internet Information Server 的体系结构

Internet 服务

inetinfo.exe 进程包括许多由 IIS 提供的 Internet 服务 (HTTP、FTP、SMTP、NNTP)。Inetinfo.exe 接收来自 TCP/IP 子系统的请求,并将这些请求送往各自的服务,这些服务又解释请求,执行请求,并把结果返回给客户机。因为所有这些服务都在同一个进程 (inetinfo.exe) 中运行,所以它们能够共享高速缓存的数据,如文件句柄、帐户信息和日志文件数据。

ISAPI

ISAPI DLL 有两种类型:ISAPI 过滤器和 ISAPI 扩展组件。

ISAPI 过滤器是在 inetinfo.exe 进程中运行的一种 DLL,用来过滤进出服务器的数据。过滤器注册事件的通知。当所选的事件发生时,控制权就会被转交给过滤器,您就可以监视和更改在服务器和客户机之间来回传送的数据。ISAPI 过滤器能用来提供 HTTP 请求的增强记录(例如,跟踪登陆到您服务器的用户)、自定义的加密、自定义的压缩或其它验证方法。一旦实施了 ISAPI 过滤器,所有的请求和响应都将通过它们,这将对站点的性能产生巨大的影响。

ISAPI 服务器扩展组件是一种能被 HTTP 服务器加载和调用的 DLL。ISAPI 服务器扩展组件,也称为 Internet 服务器应用程序 (ISA),用来增强符合 ISAPI 的服务器的功能。ISA 是从浏览响应程序中调用的,提供与公共网关接口 (CGI) 应用程序相似的功能,但它在性能上要大大优于 CGI。

Active Server Pages(ASP)

ASP 是作为 ISAPI 的扩展 DLL 实现的。IIS 和 ASP 有不同的线程池。IIS 使用一个称为异步线程队列 (ATQ) 的线程池,也叫共享池线程。IIS 用 ATQ 来接受套接字连接并向客户机发送静态内容。一旦确定请求是 ASP 页,IIS 就会将这个页请求发送到 ASP/MTS 线程池进行处理。

所有的 ISAPI 管理和 ASP 代码都被移植到一个称为 Web Application Manager (WAM) 的组件中。所有的信息都通过 WAM 进出于应用程序服务层。

异步线程队列(ATQ)

ATQ 提供了一个可重用线程池来处理每一个客户机请求。用操作系统的 Completion Port Logic 来执行调度。

Web 应用程序管理员(WAM)

WAM 是一个在 Web 服务之上的 COM 组件层,它存放 ISAPI DLL 的组件,并提供诸如支持多个 ISAPI DLL、故障恢复和进程隔离等服务。WAM 被注册为 MTS/COM+ 程序包/应用程序。

联机处理的 IIS 应用程序

如果将一个 IIS 应用程序配置为以联机处理方式(在 IIS 5.0 中为低级别的应用程序保护)运行,则它会运行在 Web 服务器 (inetinfo) 的进程空间。这提供了巨大的性能优势,因为避免了跨进程的高代价编组。但缺点是单个出现故障的应用程序就可能导致整个 Web 服务器的瘫痪。这将严重影响 Web 服务器的稳定性和可用性。默认情况下,在 IIS 4.0 中所有应用程序都是以联机处理方式运行,而在 IIS 5.0 中所有应用程序都是以共享的脱机处理方式(中等的应用程序保护)运行。

脱机处理的 IIS 应用程序

以脱机处理方式运行的应用程序阻止单个应用程序错误导致整个 inetinfo 进程瘫痪。这种服务器保护对于管理复杂的产品 Web 站点和托管多个应用程序是非常可贵的。如果一个应用程序出现故障,它的进程会自动终止,而不会影响 inetinfo 进程。

以脱机处理方式运行的应用程序的另外一个好处是,您可以卸载应用程序而无须重新启动 IIS。

以脱机处理方式运行的应用程序能获得自己的 ASP Worker 线程。这是一个非常大的优势,因为每向机器中添加一个处理器,脱机处理的应用程序就会获得另外 10 个 ASP Worker 线程。这只是默认情况,改变 ProcessorThreadMaxASPProcessorThreadMax 的值将影响这个数值。本章稍后将详细讨论这些计数器。

脱机处理的应用程序的主要缺点是,每个应用程序都有自己的进程空间,因此存在影响性能的开销。

而且,如果在单个服务器上将大量的应用程序配置为以脱机处理方式运行,将会变得相当资源密集,并会影响服务器的性能。

共享脱机处理的 IIS 应用程序 (只出现在 IIS 5.0 中)

IIS 5.0 中介于脱机处理和联机处理之间的一个新选项。所有配置为共享脱机处理的 IIS 应用程序,都运行于在 MTS/COM+ 下创建的一个服务器程序包/应用程序之下。

这个选项享有脱机处理选项的优点,因为共享应用程序有它们自己的进程空间,一个应用程序的失败不会影响个 Web 服务器的可用性。另外,因为所有共享应用程序共享相同的进程空间,所以不会像脱机处理的应用程序那样资源密集。

共享脱机处理的应用程序的缺点是,由于共享相同的进程空间,所以一个应用程序的失败将导致共享池中的所有应用程序无法运行。

在 IIS 5.0 中,默认情况下应用程序以共享脱机处理方式运行。

图 2. 进程隔离:性能与坚固性

为什么调试很重要

调试是软件开发人员为了发现并解决代码中存在的问题所使用的方法。即便在单元测试和集成测试中非常努力地查找并改正了错误,但仍然有一些错误留在产品版本中。即使经过了高质量的软件生存期(其间进行了全面的单元测试和集成测试)的产品也难以幸免。

调试可能是 Web 应用程序开发人员的工作中最令人厌烦的部分。与独立的桌面应用程序不同,Web 应用程序能够分布在若干个系统上,并且经常结合不同的程序语言和技术。尽管有些应用程序错误可以通过周密计划予以避免,但组件间复杂交互作用的不可预料的副作用仍然会导致一些错误。跟踪和捕捉这些问题经常需要用到各种调试和开发工具。

调试中最重要的问题是,您必须紧记您是在调试数据,而不是在调试代码。询问正确的问题来获得正确的数据对于成功的调试是非常重要的。数据可以是全局的也可以是局部的。人们在调试中最常犯的错误是,认为他们所看见的症状就是问题的实际原因。

在分析调试过程以前,最好先熟悉本文中将会频繁使用的与调试有关的几个术语。

  • Attching: Attaching 表示监视一个实时进程以便对它进行调试。

  • Checked/Debug Build: Checked/Debug Build 指将调试信息包含在进程中的构件。

  • Free Build: Free Build 忽略所有调试信息使进程简单而有效的运行。

  • Dumping: Dumping (转储)是这样的一个过程:当一个进程出现异常时,它在内存中的映象就被写到硬盘中的一个文件中。转储实际上是进程地址空间的一个原始快照。它的大小大约等于处理器所使用的内存的大小。调试程序可以用来分析转储文件,以确定当进程被转储时它正在做什么。


设置调试环境

调试符号(符号调试信息)

符号提供了一个解析已加载的可执行文件中的全局变量和函数名的方法。符号就是被映射到相对于 DLL 的加载基地址的偏移量的函数名称或 API 名称。在组件的编译过程中,链接程序生成符号。将符号信息包含在组件本身内部(内部符号)使得它变得易于处理,因为这种情况下不会出现不匹配的符号。在产品中通常会去掉组件的符号,这样组件的尺寸就会显著变小,当组件被加载时消耗的内存也会减少,并会使组件更高效。

DBG 文件是通过使用 SPLITSYM 或 REBASE 将符号从进程映像分离到一个单独的文件中而创建的。DBG 文件一般不包括可识别代码形式的符号,因此它不能用于源代码级的调试。

Microsoft Visual C++® 和 Microsoft Visual Basic® 目前的版本都能创建一种称为 Program Database (PDB) 的符号格式。调试程序能够直接使用这种 PDB 文件。

除了安装自定义组件的符号之外,Microsoft 产品的符号也很容易获得。

符号所在的位置

以下站点指向这些符号所在的位置

Windows NT 4 Service Pack 6 symbols

http://www.microsoft.com/ntserver/nts/downloads/recommended/sp6/debug/default.asp

Windows NT 4 Service Pack 5 Symbols

http://www.microsoft.com/ntserver/nts/downloads/recommended/sp5/debug/default.asp

Windows NT 4 Service Pack 3 Symbols:

ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/ussp3/i386/nt4sym3i.exe

http://support.microsoft.com/download/support/mslfiles/Nt4sym3i.exe

Windows NT Option Pack Symbols:

ftp://ftp.microsoft.com/bussys/IIS/iis-public/iis40/symbols/x86/symbols.cab

ftp://ftp.microsoft.com/bussys/IIS/iis-public/iis40/symbols/x86/install.inf

ftp://ftp.microsoft.com/bussys/IIS/iis-public/iis40/symbols/x86/install.exe

Windows NT Option QFE Update Symbols:

ftp://ftp.microsoft.com/bussys/IIS/iis-public/fixes/usa/IISUPD/SYMBOLS/x86/IISUpdis.exe

Site Server 3.0 Service Pack 1 Symbols:

ftp://ftp.microsoft.com/bussys/sitesrv/sitesrv-public/fixes/usa/siteserver3/sp1/x86/symbols/ss3sp1db.exe

Site Server 3.0 Service Pack 2 Symbols:

ftp://ftp.microsoft.com/bussys/sitesrv/sitesrv-public/fixes/usa/siteserver3/sp2/x86/Symbols/ss3sp2debug.exe

Microsoft Windows 2000® Server Symbols:

http://www.microsoft.com/WINDOWS2000/downloads/otherdownloads/symbols/default.asp(英文)

Windows 2000 Customer Support and Diagnostic Tools 光盘中也包含了这些符号

常用调试程序概述

CDB

CDB 是基于控制台的一种调试程序,它在一个命令窗口中启动并运行。因为它只占很小的内存空间,所以它的效率非常高。可以用它调试 Windows NT 上的 Win32 应用程序。

NTSD

NTSD 类似于 CDB,但它不是在启动它的窗口中运行,而是打开一个新窗口并在其中运行。

WinDBG

WinDBG 是一种流行的轻型 GUI 调试程序。它能调试 Windows NT、Windows 95 和 Windows 98 中的 Win32 应用程序。目前它包含在 Windows 2000 Customer Diagnostic and Support Tools CD 中。它能够执行源代码级的调试,能够读取转储文件并且对符号有极好的支持。由于它是一种 GUI 调试程序,所以比 CDB 和 NTSD 稍微慢一些。

IIS Exception Monitor 6.1

IIS Exception Monitor 是一种轻型且极易使用的调试程序。使用这种调试程序可以直接分离出引起问题的 DLL。它提供一个由内存中的进程映像组成的快照文本文件。它使用 CDB 收集信息。有时收集的信息可能不够充足。运行 IIS Exception Monitor 需要 Windows Scripting Host。您可以从借助 IIS 异常监视器进行调试(英文)下载这个工具。

Exception Monitor 7.x IIS Exception Monitor 的最新版是 DBGPLUS 套件的一部分,该套件包含了本文讨论的所有调试工具。工具名中不再包含 "IIS" 这个词,因为它已不再局限于调试 IIS 问题;可以用它来调试任何进程。该工具使用 WinDBG 收集有关它所连接的进程的信息。尽管功能与其以前的版本非常类似,但用户界面已彻底更新并加入了一些新的功能部件。该工具包含在 Windows 2000 Customer Diagnostic and Support Tools CD 中,您也可以从 Windows 2000 客户支持诊断(英文)下载它。

注:   本文中的示例是基于 IIS Exception Monitor 6.1 的。但是,稍加修改就能用于 Exception Monitor 7.x。

Developer Studio

Developer Studio 是一种集成开发环境,包括一个功能强大的调试程序。它主要用在开发阶段,其源代码级的调试功能非常出色,并且会留出很大的内存空间。将 Developer Studio 安装到计算机上会修改很多系统文件;因此,通常不会在产品环境中使用它。开发人员可以根据需要写一些自己的 add-in 来定制此调试程序。



调试过程

检查符号

调试过程的第一步就是检查是否正确地安装了符号。可以使用 CHECKSYM 工具来完成这一任务。例如,为了检查为在某个进程中运行的所有 DLL 安装的符号是否正确,您可以使用下面的命令:

checksym -p processname.exe -r -v -y c:\symbols

可以使用通配符 (*.*) 指定某个目录中的全部文件。-v 开关指示工具检查组件的符号,而 -y 开关指定符号文件的路径。

要获得有关可以与 CHECKSYM 一起使用的开关和选项的详细信息,请键入以下命令:

checksym -??

选择调试程序

各种调试程序的功能各不相同,因此,在决定使用某种调试工具之前对任务有一个深入的了解是非常重要的。调试方案大致可分为三类:本地调试,远程调试和用户转储调试。

本地调试

当您能够在本地重现问题,最好使用本地调试;因为它提供了对环境的完全控制,这样您就有可能更快地解决问题。在这个方案中,调试程序的选择和安装也相对容易一些。本地调试的缺点是,有时很难准确地在本地重复或重现(用技术支持人员的话来说,叫做 "repro")。

远程调试

当调试程序和正在调试的进程不在同一台计算机上时,称为远程调试。远程调试可按两种方式进行,一种方式是,通过代理将一个调试程序连接到远程进程;另一种方式是,在远程计算机上运行调试程序,而在本地计算机上共享调试程序的命令行。在这种情况下,代理在远程的系统上运行,而调试程序在本地系统上运行;代理连接到进程,读取进程的内存,并将它传送到本地调试程序。使用代理的远程调试的优点是,安装简单而快速。其缺点是,容易出现网络问题,有时会导致远程计算机上的代理崩溃。因为符号只安装在本地计算机上,所以它们可能与远程计算机上的符号不匹配。因此,远程调试可能相当慢。

使用共享命令行的远程调试需要使用 remote.exe 工具,它是随 Windows 2000 Customer Diagnostic and Support Tools CD 分发的。remote.exe 工具既可以作为服务器运行,也可以作为客户机运行。使用命名管道连接服务器和客户机。WSRemote.exe 是 remote.exe 的一个套接字版本/变体。Remote.exe 允许共享 STDIN(标准输入)和 STDOUT(标准输出)。在远程计算机上,可以使用下面的命令运行该远程计算机的服务器实例:

remote /s application pipename

在本地计算机上,您可以使用下面的命令将 remote.exe 作

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3233


你可能感兴趣的:(应用程序)