এই উত্তরটি পার্ল সিজিআই স্ক্রিপ্টগুলির সাথে সমস্যার মধ্য দিয়ে কাজ করার জন্য একটি সাধারণ কাঠামো হিসাবে লক্ষ্যযুক্ত এবং মূলত পার্লমনসকে ট্রাবলশুটিং পার্ল সিজিআই স্ক্রিপ্ট হিসাবে উপস্থিত হয়েছিল । এটি আপনার মুখোমুখি হওয়া প্রতিটি সমস্যার সম্পূর্ণ গাইড নয় বা বাগ স্কোয়াশিংয়ের কোনও টিউটোরিয়াল নয়। এটি বিশ বছরের (প্লাস!) বছর ধরে সিজিআই স্ক্রিপ্টগুলি ডিবাগ করার জন্য কেবল আমার অভিজ্ঞতার সমাপ্তি। এই পৃষ্ঠাটির অনেকগুলি পৃথক বাড়ি রয়েছে বলে মনে হয় এবং মনে হয় এটি বিদ্যমান রয়েছে, তাই আমি এটিকে স্ট্যাকওভারফ্লোতে যুক্ত করছি। আপনি আমাকে bdfoy@cpan.org এ কোন মন্তব্য বা পরামর্শ পাঠাতে পারেন। এটি সম্প্রদায়ের উইকিও, তবে খুব বেশি বাদাম লাগবে না। :)
সমস্যাগুলি খুঁজে পেতে সহায়তা করার জন্য আপনি কি পার্লের অন্তর্নির্মিত বৈশিষ্ট্যগুলি ব্যবহার করছেন?
পার্ল আপনাকে আপনার কোডের প্রশ্নবিদ্ধ অংশ সম্পর্কে সতর্ক করতে দিতে সতর্কতা চালু করুন। আপনি -w
স্যুইচ সহ কমান্ড লাইন থেকে এটি করতে পারেন যাতে আপনার কোনও কোড পরিবর্তন করতে বা প্রতিটি ফাইলে একটি প্রগমা যোগ করতে হয় না:
% perl -w program.pl
যাইহোক, আপনার নিজের warnings
সমস্ত ফাইলগুলিতে প্রগমা যুক্ত করে আপনার সর্বদা প্রশ্নযুক্ত কোড সাফ করার জন্য বাধ্য করা উচিত :
use warnings;
সংক্ষিপ্ত সতর্কতা বার্তার চেয়ে আপনার যদি আরও তথ্যের প্রয়োজন হয় তবে আরও তথ্য diagnostics
পেতে প্রগমাটি ব্যবহার করুন বা পারল্ডিয়াগ ডকুমেন্টেশনটি দেখুন:
use diagnostics;
আপনি কি প্রথমে একটি বৈধ সিজিআই শিরোনাম আউটপুট করেছেন?
সার্ভারটি সিজিআই স্ক্রিপ্ট থেকে প্রথম আউটপুট সিজিআই শিরোনাম হওয়ার প্রত্যাশা করছে। সাধারণত এটি সিজিআই.এম.পি এবং এর ডেরাইভেটিভস, এর মতো print "Content-type: text/plain\n\n";
বা সাধারণ হতে পারে । কিছু সার্ভার স্ট্যান্ডার্ড আউটপুট (চালু) এর আগে প্রদর্শিত ত্রুটি আউটপুট (অন ) এর প্রতি সংবেদনশীলprint header()
STDERR
STDOUT
) এর ।
ব্রাউজারে ত্রুটি প্রেরণ চেষ্টা করুন
এই লাইন যুক্ত করুন
use CGI::Carp 'fatalsToBrowser';
আপনার লিপি। এটি ব্রাউজার উইন্ডোতে সংকলন ত্রুটিগুলিও প্রেরণ করে। উত্পাদনের পরিবেশে যাওয়ার আগে এটিকে সরাতে ভুলবেন না, কারণ অতিরিক্ত তথ্য সুরক্ষা ঝুঁকি হতে পারে।
ত্রুটি লগ কি বলেছিল?
সার্ভারগুলি ত্রুটি লগগুলি রাখে (বা তাদের কমপক্ষে হওয়া উচিত)। সার্ভার থেকে এবং আপনার স্ক্রিপ্ট থেকে ত্রুটি আউটপুট সেখানে প্রদর্শিত হবে। ত্রুটি লগটি সন্ধান করুন এবং দেখুন এটি কী বলে। লগ ফাইলগুলির জন্য কোনও মানক স্থান নেই। তাদের অবস্থানের জন্য সার্ভার কনফিগারেশনটি দেখুন বা সার্ভার প্রশাসককে জিজ্ঞাসা করুন। আপনি সিজিআই :: কার্পের মতো সরঞ্জামগুলিও ব্যবহার করতে পারেন
নিজের লগ ফাইলগুলি রাখতে ।
স্ক্রিপ্টের অনুমতিগুলি কী কী?
যদি আপনি "অনুমতি অস্বীকৃত" বা "পদ্ধতি প্রয়োগ করা হয়নি" এর মতো ত্রুটি দেখতে পান তবে সম্ভবত এটির অর্থ হ'ল আপনার স্ক্রিপ্টটি ওয়েব সার্ভার ব্যবহারকারীর দ্বারা পঠনযোগ্য এবং সম্পাদনযোগ্য নয়। ইউনিক্স এর স্বাদে তারিখে, 755 মোডে পরিবর্তন বাঞ্ছনীয়:
chmod 755 filename
। 777 এ কোনও মোড কখনও সেট করবেন না!
আপনি ব্যবহার করছেন use strict
?
মনে রাখবেন পার্ল আপনি যখন এগুলি প্রথম ব্যবহার করেন তখন স্বয়ংক্রিয়ভাবে ভেরিয়েবল তৈরি করে। এটি একটি বৈশিষ্ট্য, তবে কখনও কখনও আপনি যদি কোনও ভেরিয়েবলের নামটি ভুল টাইপ করেন তবে বাগের কারণ হতে পারে। প্রগমা
use strict
আপনাকে সেই ধরণের ত্রুটিগুলি খুঁজে পেতে সহায়তা করবে। আপনি এটি ব্যবহার না করা অবধি বিরক্তিকর, তবে আপনার প্রোগ্রামিং কিছুক্ষণ পরে উন্নত হবে এবং আপনি বিভিন্ন ভুল করতে মুক্ত হবেন free
স্ক্রিপ্টটি কি সংকলন করে?
আপনি -c
স্যুইচটি ব্যবহার করে সংকলন ত্রুটিগুলি পরীক্ষা করতে পারেন। রিপোর্ট করা প্রথম ত্রুটিগুলিতে মনোনিবেশ করুন। ধুয়ে ফেলুন, পুনরাবৃত্তি করুন। আপনি যদি সত্যিই অদ্ভুত ত্রুটি পেয়ে থাকেন তবে আপনার স্ক্রিপ্টের সঠিক লাইনের শেষ রয়েছে কিনা তা পরীক্ষা করে দেখুন। আপনি যদি বাইনারি মোডে এফটিপি করেন, সিভিএস থেকে চেকআউট বা অন্য কোনও কিছু যা লাইন শেষের অনুবাদটি পরিচালনা করে না, ওয়েব সার্ভার আপনার স্ক্রিপ্টটিকে একটি বড় লাইন হিসাবে দেখতে পারে। ASCII মোডে পার্ল স্ক্রিপ্টগুলি স্থানান্তর করুন।
স্ক্রিপ্টটি কি অনিরাপদ নির্ভরতা সম্পর্কে অভিযোগ করছে?
যদি আপনার স্ক্রিপ্টটি অনিরাপদ নির্ভরতা সম্পর্কে অভিযোগ করে, আপনি সম্ভবত -T
দাগ মোড চালু করতে স্যুইচটি ব্যবহার করছেন , এটি একটি ভাল জিনিস কারণ এটি আপনাকে শেলটিতে চেক করা ডেটা পাস করার কারণে রাখে। যদি এটি অভিযোগ করে তবে এটি আমাদের আরও সুরক্ষিত স্ক্রিপ্ট লিখতে সহায়তা করার জন্য এটি কাজ করছে। প্রোগ্রামের (অর্থাত্ পরিবেশ) বাইরে থেকে উত্পন্ন কোনও তথ্য কলঙ্কিত বলে বিবেচিত হয়। পরিবেশের পরিবর্তনশীল যেমন PATH
এবং
LD_LIBRARY_PATH
বিশেষত ঝামেলাজনক। আমার পরামর্শ অনুসারে আপনাকে এগুলি নিরাপদ মান হিসাবে সেট করতে হবে বা সম্পূর্ণ আনসেট করতে হবে। আপনার যাইহোক নিখুঁত পাথ ব্যবহার করা উচিত। যদি কলঙ্কিত চেকিং অন্য কোনও বিষয়ে অভিযোগ করে তবে তা নিশ্চিত করে নিন যে আপনি ডেটাটি অকেজো করেছেন।
বিশদ জন্য perlsec ম্যান পৃষ্ঠা দেখুন ।
কমান্ড লাইন থেকে চালানোর সময় কী ঘটে?
কমান্ড লাইন থেকে চালানোর সময় স্ক্রিপ্টটি কী প্রত্যাশা করে? শিরোনাম আউটপুট কি প্রথমে একটি ফাঁকা রেখা অনুসরণ করে? মনে রাখবেন যে STDERR
সাথে মার্জ করা যেতে পারে STDOUT
যদি আপনি একটি টার্মিনাল (যেমন একটি ইন্টারেক্টিভ অধিবেশন) এ আছে, এবং বাফার উপলব্ধ কারণে এটা কল্পনাপ্রসূত অনুক্রমে দেখানো হতে পারে। $|
সত্যিকারের মানটিতে সেট করে পার্লের অটোফ্ল্যাশ বৈশিষ্ট্যটি চালু করুন । সাধারণত আপনি $|++;
সিজিআই প্রোগ্রামগুলিতে দেখতে পাবেন । একবার সেট হয়ে গেলে, প্রতিটি মুদ্রণ এবং লেখা তাত্ক্ষণিকভাবে বাফার হওয়ার পরিবর্তে আউটপুটে যাবে। প্রতিটি ফাইলহ্যান্ডেলের জন্য আপনাকে এটি সেট করতে হবে। select
ডিফল্ট ফাইলহ্যান্ডেল পরিবর্তন করতে ব্যবহার করুন , এর মতো:
$|++; #sets $| for STDOUT
$old_handle = select( STDERR ); #change to STDERR
$|++; #sets $| for STDERR
select( $old_handle ); #change back to STDOUT
যেভাবেই হোক, প্রথম জিনিস আউটপুটটি সিজিআই শিরোনাম হওয়া উচিত তার পরে একটি ফাঁকা লাইন।
আপনি যখন সিজিআই-এর মতো পরিবেশের সাথে কমান্ড লাইন থেকে চালাবেন তখন কী হবে?
ওয়েব সার্ভার পরিবেশটি সাধারণত আপনার কমান্ড লাইন পরিবেশের চেয়ে অনেক বেশি সীমাবদ্ধ থাকে এবং অনুরোধ সম্পর্কে অতিরিক্ত তথ্য থাকে। যদি আপনার স্ক্রিপ্টটি কমান্ড লাইন থেকে ঠিকঠাক চলতে পারে তবে আপনি ওয়েব সার্ভারের পরিবেশের অনুকরণের চেষ্টা করতে পারেন। সমস্যাটি যদি উপস্থিত হয় তবে আপনার পরিবেশ সমস্যা রয়েছে।
এই ভেরিয়েবলগুলি আনসেট করুন বা অপসারণ করুন
PATH
LD_LIBRARY_PATH
- সমস্ত
ORACLE_*
পরিবর্তনশীল
এই ভেরিয়েবল সেট করুন
REQUEST_METHOD
(সেট GET
, HEAD
অথবা POST
যা প্রযোজ্য)
SERVER_PORT
(সাধারণত 80 এ সেট করা হয়)
REMOTE_USER
(যদি আপনি সুরক্ষিত অ্যাক্সেস স্টাফগুলি করেন)
CGI.pm
(> ২.) Recent ) এর সাম্প্রতিক সংস্করণগুলিতে -debug
পুরানো (দরকারী) আচরণ পেতে পতাকাটি দরকার , যাতে আপনার এটিকে আপনার CGI.pm
আমদানিতে যুক্ত করতে হতে পারে ।
use CGI qw(-debug)
আপনি ব্যবহার করছেন die()
বা warn
?
আপনি STDERR
যদি তাদের নতুন সংজ্ঞা না দিয়ে থাকেন তবে এই ফাংশনগুলি মুদ্রণ করে। তারা কোনও সিজিআই শিরোনাম আউটপুট দেয় না। আপনি সিজিআই :: কার্পের মতো প্যাকেজগুলির সাথে একই কার্যকারিতাটি পেতে পারেন
আপনি ব্রাউজার ক্যাশে সাফ করার পরে কি হবে?
আপনি যদি মনে করেন যে আপনার স্ক্রিপ্টটি সঠিক কাজ করছে এবং আপনি যখন অনুরোধটি ম্যানুয়ালি সম্পাদন করেন আপনি সঠিক আউটপুট পান, ব্রাউজারটি অপরাধী হতে পারে। ক্যাশে সাফ করুন এবং পরীক্ষার সময় ক্যাশের আকার শূন্যে সেট করুন। মনে রাখবেন যে কিছু ব্রাউজারগুলি সত্যিই বোকা এবং আপনি এটি করতে বললেও নতুন সামগ্রীটি পুনরায় লোড করবে না। এটি ইউআরএল পাথের ক্ষেত্রে একই ক্ষেত্রে প্রচলিত রয়েছে তবে সামগ্রীতে পরিবর্তন হয় (যেমন ডায়নামিক চিত্র)।
আপনি যেখানে মনে করেন স্ক্রিপ্টটি এটি?
কোনও স্ক্রিপ্টে ফাইল সিস্টেমের পথটি সরাসরি স্ক্রিপ্টের ইউআরএল পাথের সাথে সম্পর্কিত নয়। এটি পরীক্ষা করতে আপনাকে একটি স্বল্প পরীক্ষার স্ক্রিপ্ট লিখতে হবে এমনকি আপনার সঠিক ডিরেক্টরি রয়েছে তা নিশ্চিত করুন। তদুপরি, আপনি কি নিশ্চিত যে আপনি সঠিক ফাইলটি সংশোধন করছেন? যদি আপনি আপনার পরিবর্তনগুলির সাথে কোনও প্রভাব না দেখেন তবে আপনি অন্য কোনও ফাইলকে সংশোধন করতে বা ভুল জায়গায় কোনও ফাইল আপলোড করছেন। (এটি, যাইহোক, এ জাতীয় সমস্যার আমার সবচেয়ে ঘন ঘন কারণ;)
আপনি কি ব্যবহার করছেন CGI.pm
, বা এটির একটি উদ্দীপনা?
আপনার সমস্যা সিজিআই ইনপুট পার্স সঙ্গে সম্পর্কযুক্ত এবং আপনার মত একটি বহুল পরীক্ষিত মডিউল ব্যবহার না করেন তাহলে CGI.pm
, CGI::Request
,
CGI::Simple
বা CGI::Lite
, মডিউলের ব্যবহার এবং জীবনের সঙ্গে পেতে।
CGI.pm
একটি আছেcgi-lib.pl
সামঞ্জস্যতা মোড রয়েছে যা আপনাকে পুরানো সিজিআই পার্সার বাস্তবায়নের কারণে ইনপুট সমস্যাগুলি সমাধান করতে সহায়তা করতে পারে।
আপনি কি পরম পথ ব্যবহার করেছেন?
আপনি যদি system
ব্যাক টিক্স, বা অন্যান্য আইপিসি সুবিধা সহ বাহ্যিক কমান্ডগুলি চালাচ্ছেন তবে আপনার
বাহ্যিক প্রোগ্রামের জন্য একটি নিখুঁত পথ ব্যবহার করা উচিত। আপনি কী চালাচ্ছেন তা কেবল আপনিই জানেন না তবে আপনি কিছু সুরক্ষা সমস্যাও এড়িয়ে চলেছেন। আপনি যদি পড়া বা লেখার জন্য ফাইলগুলি খুলছেন তবে একটি নিখুঁত পথ ব্যবহার করুন। সিজিআই স্ক্রিপ্টের বর্তমান ডিরেক্টরি সম্পর্কে আপনার চেয়ে আলাদা ধারণা থাকতে পারে। বিকল্পভাবে, আপনি chdir()
সঠিক জায়গায় রাখার জন্য আপনি একটি স্পষ্ট করতে পারেন।
আপনি কি আপনার ফেরতের মূল্য পরীক্ষা করেছেন?
বেশিরভাগ পার্ল ফাংশন আপনাকে জানায় যে তারা কাজ করেছে কি না এবং $!
ব্যর্থতা সেট করে। আপনি কি ফেরতের মানটি পরীক্ষা করে $!
ত্রুটি বার্তাগুলির জন্য পরীক্ষা করেছেন? আপনি $@
ব্যবহার করছেন কিনা তা পরীক্ষা করে দেখেছেন
eval
?
পার্লের কোন সংস্করণ আপনি ব্যবহার করছেন?
পারেলের সর্বশেষতম স্থিতিশীল সংস্করণ 5.28 (এটি কখন শেষবার সম্পাদিত হয়েছিল তার উপর নির্ভর করে)। আপনি কি পুরানো সংস্করণ ব্যবহার করছেন? পার্লের বিভিন্ন সংস্করণে সতর্কতার বিভিন্ন ধারণা থাকতে পারে।
আপনি কোন ওয়েব সার্ভার ব্যবহার করছেন?
বিভিন্ন সার্ভার একই পরিস্থিতিতে ভিন্নভাবে কাজ করতে পারে। একই সার্ভার পণ্যটি বিভিন্ন কনফিগারেশনের সাথে আলাদাভাবে কাজ করতে পারে। সাহায্যের জন্য যে কোনও অনুরোধে আপনি যতটা পারেন এই তথ্যকে অন্তর্ভুক্ত করুন।
আপনি সার্ভার ডকুমেন্টেশন চেক করেছেন?
গুরুতর সিজিআই প্রোগ্রামারদের সার্ভার সম্পর্কে যতটা সম্ভব জানা উচিত - কেবল সার্ভারের বৈশিষ্ট্য এবং আচরণই নয়, স্থানীয় কনফিগারেশনও রয়েছে। আপনি যদি বাণিজ্যিক পণ্য ব্যবহার করেন তবে আপনার সার্ভারের জন্য ডকুমেন্টেশন আপনার কাছে উপলভ্য নয়। অন্যথায়, ডকুমেন্টেশনটি আপনার সার্ভারে থাকা উচিত। যদি তা না হয় তবে ওয়েবে এটি সন্ধান করুন।
এই ব্যবহারটি কার্যকর হতে পারে তবে সমস্ত ভাল পোস্টার মারা গেছে বা ঘুরে বেড়িয়েছে।
সম্ভবত কারওর আগে আপনার সমস্যা হয়েছে এবং কেউ (সম্ভবত আমি) এই নিউজগ্রুপে এর জবাব দিয়েছে। যদিও এই নিউজগ্রুপটি তার শেষ দিনটি কেটে গেছে, অতীত থেকে সংগৃহীত জ্ঞান কখনও কখনও দরকারী হতে পারে।
আপনি একটি সংক্ষিপ্ত পরীক্ষার স্ক্রিপ্ট দিয়ে সমস্যাটি পুনরুত্পাদন করতে পারেন?
বড় সিস্টেমে, অনেকগুলি ঘটতে থাকায় কোনও বাগ সনাক্ত করতে সমস্যা হতে পারে। সংক্ষিপ্ততম স্ক্রিপ্টের সাহায্যে সমস্যা আচরণটি পুনরুত্পাদন করার চেষ্টা করুন। সমস্যাটি জেনে রাখা বেশিরভাগ স্থির। এটি অবশ্যই সময় সাশ্রয়ী হতে পারে, তবে আপনি এখনও সমস্যাটি খুঁজে পান নি এবং আপনি বিকল্পগুলির বাইরে চলেছেন। :)
আপনি কি কোনও সিনেমা দেখার সিদ্ধান্ত নিয়েছেন?
সিরিয়াসলি। কখনও কখনও আমরা সমস্যার মধ্যে এমনভাবে আবদ্ধ হতে পারি যে আমরা "পার্সেপুটিভ ট্রাইরিং" (টানেলের দৃষ্টি) বিকাশ করি। কিছুটা বিরতি, এক কাপ কফি পান, বা [ডিউক নোকেম, কোয়েক, ডুম, হ্যালো, সিওডি] তে খারাপ কিছু লোককে ব্লাস্ট করে ফেলা আপনাকে সমস্যাটি পুনরায় যোগাযোগ করার জন্য একটি নতুন দৃষ্টিভঙ্গি দিতে পারে।
আপনি কি সমস্যাটি ভোকালাইজ করেছেন?
সিরিয়াসলি আবার। কখনও কখনও উচ্চস্বরে সমস্যাটি ব্যাখ্যা করা আমাদের নিজের উত্তরগুলির দিকে নিয়ে যায়। পেঙ্গুইন (প্লাশ খেলনা) এর সাথে কথা বলুন কারণ আপনার সহকর্মীরা শুনছেন না। আপনি যদি এটি একটি গুরুতর ডিবাগিং সরঞ্জাম হিসাবে আগ্রহী হন (এবং আপনি যদি এখনই সমস্যাটি না পেয়ে থাকেন তবে আমি এটির প্রস্তাব দিই), আপনি কম্পিউটার প্রোগ্রামিংয়ের সাইকোলজিটি পড়তেও পছন্দ করতে পারেন ।