यह उत्तर पर्ल सीजीआई लिपियों के साथ समस्याओं के माध्यम से काम करने के लिए एक सामान्य रूपरेखा के रूप में अभिप्रेत है और मूल रूप से पेरलोनक्स पर समस्या निवारण पर्ल सीजीआई लिपियों के रूप में दिखाई दिया । यह हर उस समस्या के लिए एक पूर्ण मार्गदर्शिका नहीं है, जिसका सामना आप कर सकते हैं, न ही बग स्क्वाशिंग पर एक ट्यूटोरियल। यह सिर्फ बीस (प्लस!) वर्षों के लिए सीजीआई लिपियों को डिबग करने के मेरे अनुभव की परिणति है। इस पृष्ठ में कई अलग-अलग घर हैं, और मुझे लगता है कि यह भूल गया है कि यह मौजूद है, इसलिए मैं इसे StackOverflow में जोड़ रहा हूं। आप मुझे bdfoy@cpan.org पर कोई भी टिप्पणी या सुझाव भेज सकते हैं। यह सामुदायिक विकि भी है, लेकिन बहुत अधिक पागल नहीं हैं। :)
क्या आप समस्याओं को खोजने में मदद करने के लिए पर्ल की निर्मित सुविधाओं का उपयोग कर रहे हैं?
पर्ल को चेतावनी दें कि आप अपने कोड के संदिग्ध भागों के बारे में चेतावनी दें। आप इसे कमांड लाइन से -w
स्विच के साथ कर सकते हैं, ताकि आपको कोई कोड बदलने या हर फाइल में एक प्रागं जोड़ने की जरूरत न हो:
% perl -w program.pl
हालाँकि, आपको warnings
अपनी सभी फ़ाइलों के लिए प्रज्ञा को जोड़कर अपने आप को हमेशा संदिग्ध कोड को साफ़ करने के लिए मजबूर करना चाहिए :
use warnings;
यदि आपको लघु चेतावनी संदेश से अधिक जानकारी की आवश्यकता है, तो अधिक जानकारी diagnostics
प्राप्त करने के लिए प्रागमा का उपयोग करें , या पेरीडिएग प्रलेखन में देखें:
use diagnostics;
क्या आपने पहले वैध सीजीआई हेडर का उत्पादन किया था?
सर्वर CGI स्क्रिप्ट से CGI हेडर बनने के लिए पहले आउटपुट की उम्मीद कर रहा है। आमतौर पर है कि के रूप में सरल रूप में हो सकता है print "Content-type: text/plain\n\n";
या साथ CGI.pm , और उसके डेरिवेटिव print header()
। कुछ सर्वर STDERR
मानक आउटपुट (ऑन STDOUT
) से पहले त्रुटि आउटपुट (ऑन ) को दिखाने में संवेदनशील होते हैं ।
ब्राउज़र में त्रुटियाँ भेजने का प्रयास करें
इस लाइन को जोड़ें
use CGI::Carp 'fatalsToBrowser';
अपनी स्क्रिप्ट के लिए। यह ब्राउज़र विंडो में संकलन त्रुटियों को भी भेजता है। उत्पादन वातावरण में जाने से पहले इसे निकालना सुनिश्चित करें, क्योंकि अतिरिक्त जानकारी सुरक्षा जोखिम हो सकती है।
त्रुटि लॉग ने क्या कहा?
सर्वर त्रुटि लॉग (या उन्हें कम से कम) रखना चाहिए। सर्वर से त्रुटि आउटपुट और आपकी स्क्रिप्ट से वहाँ दिखाना चाहिए। त्रुटि लॉग ढूंढें और देखें कि यह क्या कहता है। लॉग फ़ाइलों के लिए एक मानक स्थान नहीं है। उनके स्थान के लिए सर्वर कॉन्फ़िगरेशन में देखें, या सर्वर व्यवस्थापक से पूछें। आप
अपनी लॉग फाइल रखने के लिए CGI :: Carp जैसे टूल का भी उपयोग कर सकते हैं ।
स्क्रिप्ट की अनुमतियां क्या हैं?
यदि आप "अनुमति अस्वीकृत" या "विधि लागू नहीं की गई" जैसी त्रुटियां देखते हैं, तो संभवतः इसका मतलब है कि वेब सर्वर उपयोगकर्ता द्वारा आपकी स्क्रिप्ट पठनीय और निष्पादन योग्य नहीं है। यूनिक्स के स्वादों पर, मोड को 755 में बदलने की सिफारिश की गई है
chmod 755 filename
:। 777 में कोई मोड सेट न करें!
क्या आप उपयोग कर रहे हैं use strict
?
याद रखें कि जब आप पहली बार उनका उपयोग करते हैं, तो पर्ल स्वचालित रूप से चर बनाता है। यह एक विशेषता है, लेकिन कभी-कभी बग का कारण बन सकता है यदि आप एक चर नाम को गलत करते हैं। प्रज्ञा
use strict
आपको उन प्रकार की त्रुटियों को खोजने में मदद करेगी। यह तब तक कष्टप्रद है जब तक आपको इसकी आदत न हो जाए, लेकिन थोड़ी देर बाद आपकी प्रोग्रामिंग में काफी सुधार होगा और आप अलग-अलग गलतियाँ करने के लिए स्वतंत्र होंगे।
स्क्रिप्ट संकलित करता है?
आप -c
स्विच का उपयोग करके संकलन त्रुटियों की जांच कर सकते हैं । रिपोर्ट की गई पहली त्रुटियों पर ध्यान दें। कुल्ला, दोहराना। यदि आपको वास्तव में अजीब त्रुटियां हो रही हैं, तो यह सुनिश्चित करने के लिए जांचें कि आपकी स्क्रिप्ट में सही लाइन एंडिंग्स हैं। यदि आप बाइनरी मोड में एफ़टीपी, सीवीएस से चेकआउट, या कुछ और जो लाइन एंड ट्रांसलेशन को हैंडल नहीं करते हैं, तो वेब सर्वर आपकी स्क्रिप्ट को एक बड़ी लाइन के रूप में देख सकता है। ASCII मोड में पर्ल स्क्रिप्ट ट्रांसफर करें।
क्या स्क्रिप्ट असुरक्षित निर्भरता के बारे में शिकायत कर रही है?
यदि आपकी स्क्रिप्ट असुरक्षित निर्भरता के बारे में शिकायत करती है, तो आप शायद -T
स्विच का उपयोग दागी मोड को चालू करने के लिए कर रहे हैं , जो एक अच्छी बात है क्योंकि यह आपके पास अनियंत्रित डेटा को शेल में भेज रहा है। यदि यह शिकायत कर रहा है कि यह अधिक सुरक्षित स्क्रिप्ट लिखने में हमारी मदद करने के लिए अपना काम कर रहा है। कार्यक्रम (अर्थात पर्यावरण) के बाहर से उत्पन्न कोई भी डेटा दागी माना जाता है। पर्यावरण चर जैसे कि PATH
और
LD_LIBRARY_PATH
विशेष रूप से परेशान करने वाले हैं। आपको इन्हें एक सुरक्षित मूल्य पर सेट करना होगा या उन्हें पूरी तरह से अनसेट करना होगा, जैसा कि मैं सुझाता हूं। आपको वैसे भी निरपेक्ष रास्तों का उपयोग करना चाहिए। यदि दागी जाँच किसी और चीज़ के बारे में शिकायत करती है, तो सुनिश्चित करें कि आपने डेटा को प्राप्त नहीं किया है। देखें perlsec
जानकारी के लिए आदमी पेज।
जब आप इसे कमांड लाइन से चलाते हैं तो क्या होता है?
क्या कमांड लाइन से चलने पर स्क्रिप्ट आउटपुट होता है? क्या हेडर आउटपुट पहले है, उसके बाद एक खाली लाइन है? याद रखें कि
यदि आप एक टर्मिनल पर हैं (जैसे कि एक इंटरैक्टिव सत्र), और बफ़रिंग के कारण एक जंबल्ड क्रम में दिखाई STDERR
दे सकता है तो विलय हो सकता है STDOUT
। $|
सच्चे मूल्य पर सेट करके पर्ल के ऑटोफ्लश फीचर को चालू करें । आमतौर पर आप $|++;
CGI कार्यक्रमों में देख सकते हैं । एक बार सेट हो जाने पर, हर प्रिंट और राइट बफ़र्ड होने के बजाय तुरंत आउटपुट पर जाएगा। आपको इसे प्रत्येक फ़ाइलहैंडल के लिए सेट करना होगा। select
डिफ़ॉल्ट फ़ाइलहैंडल को बदलने के लिए उपयोग करें , जैसे:
$|++; #sets $| for STDOUT
$old_handle = select( STDERR ); #change to STDERR
$|++; #sets $| for STDERR
select( $old_handle ); #change back to STDOUT
किसी भी तरह से, पहली बात आउटपुट सीजीआई हेडर होना चाहिए और उसके बाद एक खाली लाइन।
क्या होता है जब आप इसे कमांड लाइन से CGI जैसे पर्यावरण से चलाते हैं?
वेब सर्वर वातावरण आमतौर पर आपके कमांड लाइन वातावरण की तुलना में बहुत अधिक सीमित है, और अनुरोध के बारे में अतिरिक्त जानकारी है। यदि आपकी स्क्रिप्ट कमांड लाइन से ठीक चलती है, तो आप एक वेब सर्वर वातावरण का अनुकरण करने का प्रयास कर सकते हैं। यदि समस्या दिखाई देती है, तो आपके पास एक पर्यावरण समस्या है।
इन चरों को परेशान या हटाएं
PATH
LD_LIBRARY_PATH
- सभी
ORACLE_*
चर
ये चर सेट करें
REQUEST_METHOD
(करने के लिए सेट GET
, HEAD
या POST
उचित रूप में)
SERVER_PORT
(आमतौर पर 80 पर सेट)
REMOTE_USER
(यदि आप संरक्षित एक्सेस सामान कर रहे हैं)
CGI.pm
(> 2.75) के हाल के संस्करणों को -debug
पुराने (उपयोगी) व्यवहार को प्राप्त करने के लिए ध्वज की आवश्यकता है, इसलिए आपको इसे अपने CGI.pm
आयातों में जोड़ना पड़ सकता है ।
use CGI qw(-debug)
आप उपयोग कर रहे हैं die()
या warn
?
STDERR
जब तक आप उन्हें नए सिरे से परिभाषित नहीं करते हैं तब तक वे कार्य प्रिंट होते रहते हैं वे या तो CGI हेडर का उत्पादन नहीं करते हैं। आप CGI :: कार्प जैसे पैकेज के साथ समान कार्यक्षमता प्राप्त कर सकते हैं
ब्राउज़र कैश साफ़ करने के बाद क्या होता है?
अगर आपको लगता है कि आपकी स्क्रिप्ट सही काम कर रही है, और जब आप मैन्युअल रूप से अनुरोध करते हैं कि आपको सही आउटपुट मिले, तो ब्राउज़र अपराधी हो सकता है। कैश साफ़ करें और परीक्षण करते समय कैश आकार शून्य पर सेट करें। याद रखें कि कुछ ब्राउज़र वास्तव में बेवकूफ हैं और वास्तव में नई सामग्री को फिर से लोड नहीं करेंगे, भले ही आप ऐसा करने के लिए कहें। यह उन मामलों में विशेष रूप से प्रचलित है जहां URL पथ समान है, लेकिन सामग्री बदलती है (जैसे गतिशील छवियां)।
क्या आपको लगता है कि स्क्रिप्ट है?
स्क्रिप्ट के लिए फ़ाइल सिस्टम पथ आवश्यक नहीं है कि वह सीधे स्क्रिप्ट के URL पथ से संबंधित हो। सुनिश्चित करें कि आपके पास सही निर्देशिका है, भले ही आपको इसे परीक्षण करने के लिए एक छोटी परीक्षण स्क्रिप्ट लिखनी पड़े। इसके अलावा, क्या आप सुनिश्चित हैं कि आप सही फ़ाइल को संशोधित कर रहे हैं? यदि आपको अपने परिवर्तनों के साथ कोई प्रभाव दिखाई नहीं देता है, तो आप किसी भिन्न फ़ाइल को संशोधित कर सकते हैं, या किसी फ़ाइल को गलत स्थान पर अपलोड कर सकते हैं। (यह, वैसे, मेरी ऐसी परेशानी का सबसे लगातार कारण है;)
क्या आप इसका उपयोग कर रहे हैं CGI.pm
या इसका व्युत्पन्न कर रहे हैं ?
यदि आपकी समस्या CGI इनपुट पार्स करने से संबंधित है और आप व्यापक रूप से परीक्षण किए गए मॉड्यूल का उपयोग नहीं कर रहे हैं CGI.pm
, जैसे CGI::Request
,
CGI::Simple
या CGI::Lite
, मॉड्यूल का उपयोग करें और जीवन के साथ प्राप्त करें।
CGI.pm
एक cgi-lib.pl
संगतता मोड है जो पुराने CGI पार्सर कार्यान्वयन के कारण इनपुट समस्याओं को हल करने में आपकी सहायता कर सकता है।
क्या आपने निरपेक्ष रास्तों का उपयोग किया?
यदि आप बाहरी कमांड्स system
, बैक टिक्स, या अन्य IPC सुविधाओं के साथ चल रहे हैं
, तो आपको बाहरी प्रोग्राम के लिए एक निरपेक्ष पथ का उपयोग करना चाहिए। न केवल आपको पता है कि आप क्या चला रहे हैं, बल्कि आप कुछ सुरक्षा समस्याओं से भी बचते हैं। यदि आप या तो पढ़ने या लिखने के लिए फाइलें खोल रहे हैं, तो एक पूर्ण पथ का उपयोग करें। CGI स्क्रिप्ट में आपकी वर्तमान निर्देशिका के बारे में एक अलग विचार हो सकता है। वैकल्पिक रूप से, आप chdir()
सही जगह पर रखने के लिए एक स्पष्ट कर सकते हैं ।
क्या आपने अपने रिटर्न मूल्यों की जांच की?
अधिकांश पर्ल फ़ंक्शन आपको बताएंगे कि उन्होंने काम किया या नहीं और $!
विफलता पर सेट होगा । क्या आपने रिटर्न वैल्यू की जांच की और $!
त्रुटि संदेशों की जांच की ? $@
यदि आप उपयोग कर रहे थे तो क्या आपने जाँच की
थी eval
?
पर्ल का कौन सा संस्करण आप उपयोग कर रहे हैं?
पर्ल का नवीनतम स्थिर संस्करण 5.28 है (या नहीं, यह इस बात पर निर्भर करता है कि यह आखिरी बार कब संपादित किया गया था)। क्या आप पुराने संस्करण का उपयोग कर रहे हैं? पर्ल के विभिन्न संस्करणों में चेतावनी के विभिन्न विचार हो सकते हैं।
आप किस वेब सर्वर का उपयोग कर रहे हैं?
अलग-अलग सर्वर एक ही स्थिति में अलग-अलग कार्य कर सकते हैं। एक ही सर्वर उत्पाद अलग-अलग कॉन्फ़िगरेशन के साथ अलग-अलग कार्य कर सकता है। मदद के लिए किसी भी अनुरोध में इस जानकारी को अधिक से अधिक शामिल करें।
क्या आपने सर्वर प्रलेखन की जांच की?
गंभीर सीजीआई प्रोग्रामर को सर्वर के बारे में जितना संभव हो पता होना चाहिए - जिसमें न केवल सर्वर की विशेषताएं और व्यवहार, बल्कि स्थानीय कॉन्फ़िगरेशन भी शामिल है। यदि आप किसी व्यावसायिक उत्पाद का उपयोग कर रहे हैं तो आपके सर्वर के लिए दस्तावेज़ आपके लिए उपलब्ध नहीं हो सकते हैं। अन्यथा, दस्तावेज़ आपके सर्वर पर होना चाहिए। यदि ऐसा नहीं है, तो वेब पर इसके लिए देखें।
यह उपयोगी होने के लिए उपयोग होता है लेकिन सभी अच्छे पोस्टर या तो मर गए हैं या भटक गए हैं।
यह संभावना है कि किसी को आपकी समस्या पहले हो गई है, और किसी ने (संभवतः मुझे) इस समाचार समूह में इसका उत्तर दिया है। हालाँकि इस समाचार समूह ने अपना दिन बिताया है, लेकिन अतीत से एकत्र ज्ञान कभी-कभी उपयोगी हो सकता है।
क्या आप लघु परीक्षण स्क्रिप्ट के साथ समस्या को पुन: उत्पन्न कर सकते हैं?
बड़े सिस्टम में, बग को ट्रैक करना मुश्किल हो सकता है क्योंकि बहुत सारी चीजें हो रही हैं। कम से कम संभव स्क्रिप्ट के साथ समस्या व्यवहार को पुन: पेश करने का प्रयास करें। समस्या को जानना सबसे ज्यादा ठीक है। यह निश्चित रूप से समय लेने वाला हो सकता है, लेकिन आपको अभी तक समस्या नहीं मिली है और आप विकल्पों से बाहर चल रहे हैं। :)
क्या आपने फिल्म देखने का फैसला किया?
गंभीरता से। कभी-कभी हम समस्या में इतने अधिक लिपट जाते हैं कि हम "अवधारणात्मक संकीर्णता" (सुरंग दृष्टि) विकसित कर लेते हैं। ब्रेक लेना, एक कप कॉफी लेना, या [ड्यूक नुकेम, क्वेक, डूम, हेलो, सीओडी] में कुछ बुरे लोगों को नष्ट करना आपको ताजा दृष्टिकोण दे सकता है जिसे आपको समस्या को फिर से समझने की आवश्यकता है।
क्या आपने समस्या को मुखर किया है?
गंभीरता से फिर से। कभी-कभी समस्या की व्याख्या करने से हमें अपने स्वयं के उत्तरों की ओर ले जाता है। पेंगुइन (आलीशान खिलौना) से बात करें क्योंकि आपके सहकर्मी सुन नहीं रहे हैं। यदि आप इसमें एक गंभीर डिबगिंग टूल के रूप में रुचि रखते हैं (और मैं आपको यह सलाह देता हूं कि यदि आपको अब तक समस्या नहीं मिली है), तो आप कंप्यूटर के मनोविज्ञान को पढ़ना भी पसंद कर सकते हैं ।