日期:2014-04-08  浏览次数:20726 次

7.5.1 常规调试技术
在第2章中,已经看到如何使用Response.Write方法以及Request集合来显示集合的内容。如果代码要使用来自请求的值,首先要做的是保证所需的值存在。很容易出现的问题是错拼或改变的<FORM>网页中HTML控件的名字,或者创建附加在URL后面的查询字符串时出现了错误的客户端。
1. 显示各种集合内容
当程序试图使用用户提供的值运行时,可能没有得到所期望的结果,或者什么结果也没得到。记住,引用Request对象的集合中一个并不存在的值(例如,在窗体上没有一个名为“ThisControl”的控件时,使用Request.Form("ThisControl")不会引起错误。结果可能只得到一个空字符串。如果期望查找存储在用户的Session对象或全局Application对象变量中的数值,同样可能出现这种情况。
如果创建一个页面用来显示所有Request对象集合、Session和Application对象的Contents和StaticContens集合的内容,可以任何网页使用Server.Execute对其进行访问。所需要做的工作是把下面程序行加到ASP网页中,用来显示集合的全部内容。当然,根据服务器上文件存放的位置,必须给文件设置相应的路径。
<% Server.Execute "/path_to_file/debug_Request.asp" %>
这是一种很好的方法,保证我们希望在Request、Session和Application集合中找到的任何值确实存在,并且包含了合适的值。在本书的示例文件Chapter07子目录中提供了一个相应的文件,取名为debug_Request.asp。它基本上是用于第2章的show_request.asp网页和用于第3章的show_application.asp和show_session.asp网页的一个组合,但删除了部分HTML程序代码。它只是简单地遍历了集合并把值放到当前页面中。
可以通过运行“Custom Error Page”实例来查看这个页面。这个实例在本章前面看到过,打开时请选中“Display debugging information”复选框,或者直接在chapter07目录中的主菜单网页中打开。
2. 显示中间值
在网页中查看运行情况的第二个方法是显示网页运行时变量的值.当大概知道了错误来自何处,哪个变量在起作用时,这种传统技术还是不能废弃的。但由于IIS 5.0网页缓冲方式的改变,使得使用这项技术比较困难。
在ASP和IIS的先前版本中,缺省时关闭页面缓冲,并且几乎没有人想到将缓冲打开(使用Response.Buffer = True打开),除非想使用Response.Redirect完成网页的再定向(参看第2章)。响应多个请求时,由于缓冲减小了网页间切换的次数,从而提高了IIS的效率。
然而,当出现一个使运行停止的运行期错误时,IIS自动调用Response.Clear方法,再调用Server.Execute来装入定制错误网页,因此写进网页的任何输出都丢失了。解决方法是暂时增加下面的程序行:
<% Response.Buffer = False %>
此程序行放在页面顶部<@LANGUAGE...>指令后面,任何由Response.Write语句生成的调试输出将出现在定制错误网页的顶部。记住在完成网页调试之后将它去掉。
强行使程序运行通过一个错误点,然后显示可疑的变量值,这种方法有时也是有用的。只需在网页开始处附近增加On Error Resume Next语句,然后就能访问Err对象(在VBScript中),并显示错误号、错误源和描述。
3. 检查组件属性值
如果使用的组件具有在ASP脚本代码中设置的属性,在完成设置之后,并且调用组件方法之前和之后,能通过显示所有属性(或仅是可疑的属性)来跟踪错误。当一个方法运行时,可能发现属性值意外地被组件改变了,这或许是故意的,或者是因为组件中的缺陷。没有亲自检查实际代码,不要做任何假设。

7.5.2 Microsoft Script Debugger
当开发更复杂的处理实际任务的应用程序时,经常需要一个更加强大的工具来进行调试。Microsoft Script Debugger(微软脚本调试器)是一种允许调试运行在客户机和服务器上的脚本的调试工具。它能用于任何启用ActiveX的脚本语言(包括VBScript和JScript)编写的程序,也能够用来调试对Java applet、Java Bean和ActiveX组件的调用。
在研究这个工具之前,先简要说明一些问题。如前所述,ASP应用程序由两种脚本组成,一种是客户端脚本,一种是服务器端脚本。客户端脚本通常由VBScript或JScript脚本语句组成,当其到达客户端时出现在HTML页面中并在此执行,可能是在载入文档时或是在对一些事件的响应中。服务器端脚本通常也由VBScript或JScript语句组成。当浏览器请示网页时,服务器端脚本由IIS执行。在下面的讨论中,将讨论服务器端脚本调试的方法。然而所讨论的许多技术也可用于客户端脚本调试。
1. 服务器端的调试
为了调试服务器端脚本,在运行IIS的计算机上运行脚本调试器,然而在使用脚本调试器之前,必须启用调试。为了使性能最优化,基于ASP的应用程序在缺省情况下关闭了调试功能。
注意,不要对生产性的应用程序(即处于活动状态的并被他人使用的公用网站)打开调试功能。这样会减慢整个应用程序的运行,并且错误能使网页出现不确定的停止运行情况。
调试仅能为虚拟应用程序和整个Web网站进行设置,为了启用调试,打开应用程序或站点的Properties对话框,在Home Directory选项卡中,点击Configuration按钮,在Application Configuration对话框的App Debugging选项卡中,选择Enable ASP server-side script debugger,如图7-22所示。下面准备调试我们的应用程序。

图7-22 启用调试的屏幕
注意Application Configuration对话框包含一个复选框,能够启用客户端脚本调试。这一点在IIS 5.0中没有实现,在文档中仅标记为“reserved for future use”。如果通常的500-100.asp定制错误页面不可用,Script Error messages部分中包含将文本。
(1) 处理服务器脚本
不像客户端脚本,基于ASP应用程序脚本不是事件驱动的。当客户端要求一个来自服务器的网页时,服务器读取网页内容,并处理所有的服务器脚本(即在<%...%>和<SCRIPT RUNAT="SERVER"></SCRIPT>段中的所有内容),也包括在HTML文本中的“行内”脚本段内容,例如:
The valve of the result is: <% = strResult %>
处理流程显示在图7-23所示的框图中:

图7-23 服务器脚本运行流程图
当IIS载入网页时将处理ASP页面中的所有脚本,在任何输出送给客户端之前,ASP及脚本引擎能够捕获语法和运行期错误(除非你关闭缓冲或调用Response.Flush方法)。
(2) 脚本调试器提供的帮助
启用脚本调试时,如果出现错误,在服务器屏幕上可以看到一个描述ASP代码错误的对话框,点击OK,然后调入当前ASP网页的一个只读拷贝,打开的脚本调试器,错误出现的行由箭头指示,如图7-24所示:

图7-24 脚本调试器
这里,错误的产生是由于出现了Page Counter对象方法的名字错误,应是PageHit而不是DoPageHit。同时,脚本调试器找到了错误并且终止了页面的运行,工具条上的按钮用于程序的继续运行、单步程序运行或者终止页面的处理。
工具条最右边的按钮打开脚本调试器中的Immediate窗口,可以用它和页面进行交互,并且很可能找到出错的地方。例如,可以查询或者设置变量值或组件属性,可以执行内部函数和子程序、自定义函数和子程序以及已经创建的对象方法等。在图中,调用了Page Counter组件的PageHit方法,然后查询Hits属性以得到正在运行的脚本中该处的值。
为了了解为什么在“公共”网站上不应使用脚本调试器,可以从客户机上打开一个包含服务器端错误的页面。在这种情况下,错误信息对话框出现在服务器上,脚本调试器也在服务器上打开。在客户机上,直到运行在服务器上的脚本调试器关闭,才开始载入该页面。
(3) 启动和使用调试器
启用脚本调试后,虚拟应用程序的网页中出现错误时,脚本调试器自动

[1] [2] 下一页&