聯網調試CGI程序心得

聯網調試CGI程序心得

初學用PERL寫CGI程序,也找了個PERL的調試器PERL DEBUGGER來用,但好象對中文WINDOWS支持有問題,代碼區總是一片混亂,一氣之下就直接上網調試,一番頭破血流下來,也積累了一些心得,寫出來供跟我一樣正在學習PERL的CGI編程的朋友們參考。

CGI程序最常見的錯誤就是500 Internal Server Error,對于這個錯誤提示,可以按以下步驟查找原因。

一、檢查CGI程序的屬性,一定要設爲755才可以。

二、檢查一下是不是用了BINARY方式上傳,CGI程序一定要用ASCII方式上傳。建議在所用的FTP軟件裏把.cgi,.pl都設定爲使用ASCII方式,並且把連接選項裏的上傳方式設爲AUTO。

三、假如上面兩項都沒有問題,那就是程序本身有語法問題,常見的語法問題有以下一些:

1。沒有指定perl解釋器的位置,程序的第一行必須是服務器上PERL解釋器的位置,一般是#!/usr/bin/perl

2。在輸出前沒有先輸出一個http頭CGI程序必須告訴浏覽器,這以後的輸出將作爲一個Html文檔來對待,建議將這個語句作爲一個函數,在輸出前調用之,下面是一個例子。

sub Head {

print 「Content-type: text/htmlnn」;

}

3。某語句少寫了分號

4。括號、引號等不配套,常見的是少寫一邊,或者單雙引號混用了(究竟都是一個鍵啊),還有就是多寫了引號,我在把DW裏生成的HTML代碼COPY到程序裏時就經常犯這個錯誤。

5。給變量賦了非法的值

如$mail="xxx@xxx.com";就是一個非法的賦值,應該寫成$cgiurl="xxx@sina.com";或者使用單引號。

四、碰到上面3、4、5這樣的情況,最主要的工作就是定位有問題的語句。

我所用的方法是這樣的。

################

# 錯誤處理 #

################

sub error {

&Header('錯誤',"錯誤:$_[0]");

print "$_[1]";

&Tailer;

exit 0;

}

##################

# HTML 頁面頭部 #

##################

sub Header {

my ($title,$header) = @_;

print "Content-type: text/htmlnn";

print "n";

print "n";

print "

$headern";

}

#################

# HTML 頁面尾部 #

#################

sub Tailer {

print "";

}

將上面這個錯誤處理函數放在程序的最尾部,而在程序的最前面就調用它,&error('調試','程序頭');平時將這一句注釋掉,出現500錯時將注釋去掉,然後就可以使用Cut&Paste大法來查找錯誤語句了。具體方法是這樣的:

1)先把&error()這一句到錯誤處理函數之間的語句Cut掉,上傳執行,這樣應該肯定能執行。此時應顯示「錯誤:調試」和「程序頭」字樣。

2)將語句Paste回來,選取一半左右的語句Cut掉,當然要注重保持函數、循環的完整性,上傳,看是否能夠執行。

3)若能執行,有問題的語句一定在被Cut掉的那一半裏,若不能執行,起碼剩下的這一半語句就有問題。

4)這樣反複Cut&Paste,很快就能找到錯誤語句的位置。

其實實際運用中並不一定如此死板,一般來說自己改過什麽地方以後才出的錯心中都是有數的,只要對這些地方重點使用C&P大法,效率會更高。

五、除了500錯誤之外,更難查找的是邏輯錯誤

查找邏輯錯誤只有靠設斷點,觀察變量值來判定錯誤的可能之處,這時候error這個函數又有用了,你可以方便的用它來設斷點和觀察變量的值,只要在想設斷點的地方調用它就可以了,再把它的兩個參數設爲你想觀察的變量,如&error("abc:$abc","def:$def");將中斷程序執行並輸出$abc和$def的值供參考。

在實際的CGI編程中,有很多錯誤跟由表單提交來的數據源有很大的關系,因此,查找邏輯錯誤時首先就要檢查程序是否正確的接收了表單數據,下面的程序段就是用于顯示所有表單提交給程序的數據:

&GetForm;

&ViewForm;

################

#顯示Form數據 #

################

sub ViewForm{

&Header ('','表單');

foreach $key (keys %FORM){

print

"$key:$FORM{$key}";

print '

';

}

exit 0;

}

################

#取得Form數據 #

################

sub GetForm{

@querys = split(/&/, $ENV{'QUERY_STRING'});

foreach (@querys) {

($name,$value) = split(/=/, $_);

&SetValueToForm($name, $value);

}

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

@pairs = split(/&/, $buffer);

foreach (@pairs) {

($name, $value) = split(/=/, $_);

&SetValueToForm($name, $value);

}

}

################

#爲$FORM賦值 #

################

sub SetValueToForm {

$name=$_[0];

$value=$_[1];

$name=&Decode($name);

$value=&Decode($value);

if ($FORM{$_[0]}) {

$FORM{$_[0]}="$FORM{$_[0]}§$_[1]";}

else {$FORM{$_[0]}=$_[1];}

}

##############

#譯碼 #

##############

sub Decode {

my ($code)=$_[0];

$code =~ tr/+/ /;

$code =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

return $code;

}

你可以把這裏的幾個自定義的函數都放在程序的結尾,在程序的開頭都寫上

&GetForm;

#&ViewForm;

#&error('調試','程序頭');

你會發現它們對你調試程序有很大的幫助。

 
在 WIN9X 系統下輕松調試 LINUX 操作系統下的 CGI 程序
編制Linux Web服務器下的CGI程序,需要具備相應的程序調試環境。LINUX操作系統的普及,使每個人都更有可能去參與Web Server方面的編程。對一個熟練掌握一門或幾門編程語言的程序員來說,編一個Web Server下的程序...查看完整版>>在 WIN9X 系統下輕松調試 LINUX 操作系統下的 CGI 程序
 
J2ME中使用Socket開發聯網程序
J2ME中使用Socket開發聯網程序
  在J2ME中基于UDP協議編程一文中介紹了如何使用Datagram和DatagramConnection來開發應用程序,本文將主要講述在MIDP2.0中使用ServerSocketConnection和SocketConnection來開發聯網應用程序。TCP協議是可以保證傳輸...查看完整版>>J2ME中使用Socket開發聯網程序
 
Palm J2ME串行通訊程序編寫與調試
Palm J2ME串行通訊程序編寫與調試
  Palm是3Com公司的産品,其操作系統PalmOS是一種32位的嵌入式操作系統。Palm硬件提供了標准串行通訊接口(RS232接口)和紅外線傳輸接口。利用它可以方便地與其它外部設備通訊、傳輸數據。目前3Com公司與Sun公司積...查看完整版>>Palm J2ME串行通訊程序編寫與調試
 
JBuilder下調試java程序最簡單的例子
初學者總問如何在JBuilder中調試Java程序,下面給出個最簡單的例子:首先在 JBuilder建立了一個空的工程 App.jpx,然後再在工程裏面添加了一個文件"Hello.java"(是用他的向導生成的:Files->New...->Class) //He...查看完整版>>JBuilder下調試java程序最簡單的例子
 
PalmJ2ME串行通訊程序編寫與調試
  Palm是3Com公司的産品,其操作系統PalmOS是一種32位的嵌入式操作系統。Palm硬件提供了標准串行通訊接口(RS232接口)和紅外線傳輸接口。利用它可以方便地與其它外部設備通訊、傳輸數據。目前3Com公司與Sun公司積...查看完整版>>PalmJ2ME串行通訊程序編寫與調試