| 導購 | 订阅 | 在线投稿
分享
 
 
 

聯網調試CGI程序心得

來源:互聯網  2008-06-01 01:10:31  評論

聯網調試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('調試','程序頭');

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

聯網調試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('調試','程序頭'); 你會發現它們對你調試程序有很大的幫助。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有