Web设计小组


第4节:CGI应用程序故障排除

由于其他文档对这个主题有很好的介绍,所以这个常见问题相对来说没什么好说的。Eric Wienke在上有一个页面“调试CGI脚本101”http://www.liquidsilver.com/scripts/debug101.htmlTom Christiansen的“解决Perl/CGI问题的白痴指南”是一本有点开玩笑的常见问题列表,以及如何跟踪他们倒下了。Tom所涵盖的大部分内容并不是专门针对Perl,而是同样适用于其他语言的CGI编程。Marc Hedlund的CGI常见问题解答和Thomas Boutel的WWW常见问题解答处理这个问题。请参阅下面的“进一步阅读”(如果您不知道在哪里可以找到这些文档)。

4.1:是否有一些交互式调试工具和服务可用?

(1) 几个CGI编程库提供了强大的交互功能调试设施。其中包括:-对于Perl,Lincoln Stein的CGI.pm(现在是标准Perl发行版的一部分)-对于Tcl,Don Libes的cgi.Tclhttp://expect.nist.gov/cgi.tcl-对于C++,Nick Kew的CGI++http://www.webthing.com/cgiplusplus网站/(2) Nathan Neulinger的cgiwrap是另一个带有调试辅助工具的包。网址:http://www.umr.edu/~cgiwrap/(3) “mod_cgi”Apache模块(Apache 1.2中的新模块)使您能够捕获脚本输出和错误以进行诊断。另请参阅下一个问题。
[目录] [索引]

4.2:我的标题有问题。我能做什么?

对于简单的情况,“手动”检查响应标头就足够了:(1) telnet到运行服务器的主机和端口-例如。电话网www.myhost.com 80(2) 输入HTTP请求。为此,最有用的通常是HEAD;HEAD/index.html HTTP/1.0(可选HTTP标头)(后跟空行)现在您将得到一个完整的HTTP响应头。对于复杂的情况,例如发送带有标头的请求(作为浏览器dos)或POST表格,作者的免费在线诊断cg-eye是包含在相应的工具包中,网址为http://www.htmlhelp.org/tools/
     http://www.webthing.com/代客泊车/这将离线cgi“linter”与两个在线服务相结合:(a) 交互模式允许您制定HTTP请求,然后将其发送到您的服务器。(b) 实时模式提交您的表单,与从您的浏览器。在这两种情况下,它都会打印交易的详细报告,或者(如果CGI正在生成HTML页面)验证它。
[目录] [索引]

4.3:为什么出现错误500(“脚本行为错误”或“内部服务器错误”)

您的脚本必须遵循CGI界面,该界面要求打印:(1) 一个或多个标题行。(2) 空白行(3) (可选,但强烈建议)文件正文。这个错误意味着它没有。标题行可以包含HTTP下有效的任何内容,但必须通常包括三个特殊CGI头中的至少一个:内容类型位置状态示例(通过CGI的一个非常小的HTML页面)内容类型:text/html<=标题<=空行HelloWorld你好世界脚本失败的一个常见原因是它在打印之前崩溃标题和空行(或者在它们被缓冲时)。或者说它根本没有运行:您可以从命令行以及检查文件权限和服务器配置,是吗?另一个可能的原因是它打印了其他内容,比如错误消息-在标题中。检查错误日志,放置虚拟头在顶部(仅用于调试),查看“白痴指南”,并使用CGI库的调试模式。
[目录] [索引]

4.4:我试图使用(Content-Type | Location | whatever),但它出现在我的浏览器中?

这意味着你把线放错了地方。它必须出现在CGI标题,而不是文档正文。请参阅上一个问题。也有可能您根本没有打印页眉,或者页眉为空标头前面或里面的线路或其他噪音,但HTTPD有为您更正了此错误(更正错误的服务器可能会出现“在A上工作而不是在B上工作”的现象)。请参阅前面的问题。
[目录] [索引]

4.5:如何在调试器中“实时”运行CGI程序?

David S.Jackson提供了以下提示:>我有一个很好的技巧来调试用C/C++编写的CGI>UNIX。您可能想将其添加到CGI常见问题的调试部分。>>首先,在CGI代码的开头,添加“sleep(30);”。这将导致>CGI在30秒内什么也不做(你可能需要调整这个>时间)。使用调试信息(gcc中的“-g”)编译CGI并安装>CGI正常。接下来,使用web浏览器激活CGI。它的意志>当然只是坐在那里无所事事。当它处于“睡眠”状态时,找到PID>(ps-a | grep<cgi名称>)。加载调试器并附加到该PID>(gdb中的“attach<pid>”)。您还需要告诉它在哪里可以找到>符号定义(gdb中的“symbol-file<cgi>”)。然后设置断点>调用sleep函数后,就可以进行调试了。>请注意,如果你的浏览器没有收到消息,它最终会超时>什么都可以。(有人知道脚本语言的类似技巧吗?)?
[目录] [索引]

4.6:我正在使用嵌入在HTML中的QUERY_STRING的CGI,但它被破坏了吗?

问题是&字符,它有两个不同的特殊含义:-在HTTP(以及CGI)中,它是QUERY_STRING中的分隔符-在HTML中,它是转义符因此,当它出现在HTML上下文中时,应该对其进行编码。如果你需要使用QUERY_STRING“a=1&b=2”链接到myprog.cgi我的程序</a>浏览器的HTML解析器将转换为您想要的内容。这里可能存在浏览器问题,尽管它们看起来是仅限于较旧的浏览器。其他一些方法包括:-在此调用时,在CGI程序中使用不同的分隔符方式。甚至是完全不同的编码。这是安全的,但可能除非你的CGI库支持设置不同的分隔符。-避免使用任何名称包含任何HTML实体名称的参数。如果实体集在未来发生变化,则可能存在风险,或者当浏览器引入专有的“扩展”时。
[目录] [索引]

主页,论坛,参考,工具,常见问题解答,文章,设计,链接

版权© 1996 - 2006.Web设计组保留所有权利。