आप PHP स्क्रिप्ट को कैसे डिबग करते हैं? [बन्द है]


403

आप PHP स्क्रिप्ट को कैसे डिबग करते हैं ?

मुझे मूल डीबगिंग के बारे में पता है जैसे त्रुटि रिपोर्टिंग का उपयोग करना। PHPEclipse में ब्रेकपॉइंट डीबगिंग भी काफी उपयोगी है।

PhpStorm या किसी अन्य IDE में डीबग करने का सबसे अच्छा (तेज़ और आसान के रूप में) तरीका क्या है?


इन्हें भी देखें: stackoverflow.com/questions/4640421/…
kenorb


40
मेरा मानना ​​है कि यह एक महान प्रश्न है! जब आप PHP डिबगिंग के बारे में नहीं जानते हैं, तो आप यह भी नहीं जानते कि अपने प्रश्न को कैसे शब्द दें, यह नहीं जानते कि इससे अधिक सटीक कैसे हो। इसलिए, यह स्टैक के नियमों का पालन नहीं कर सकता है, लेकिन यह सुनिश्चित करता है कि हमारी मदद करता है, शुरुआती, बहुत कुछ!
मिहैला

1
php5.4 से बाद में phpdbg ( phpdbg.com ) नामक नई कमांड लाइन इंटरफ़ेस डीबगर की शुरुआत हुई । PHP5.6 डिफ़ॉल्ट phpdbg के साथ आएगा।
गणेश पाटिल Ganesh

1
कभी XDebug के बारे में सुना है? :)
प्रतीक

जवाबों:


145

Eclipse PDT को ग्रहण वातावरण में सेट करने का प्रयास करें जिसमें आपके द्वारा बताई गई विशेषताओं जैसी डीबगिंग है। कोड में कदम रखने की क्षमता डिबग करने का एक बेहतर तरीका है, फिर var_dump की पुरानी विधि और विभिन्न बिंदुओं पर प्रिंट करके देखें कि आपका प्रवाह कहां गलत है। जब बाकी सब विफल रहता है और मेरे पास सब SSH है और मैं अभी भी var_dump()/ die()जहां कोड दक्षिण में जाता है, उसे ढूंढना है।


35
आपको इस फ़ंक्शन का उपयोग करना चाहिए: किल ($ डेटा) {डाई (var_dump ($ डेटा)); } यह 10 अक्षरों को टाइप करने से बचाता है, सबसे अच्छा फंक्शन जिसे मैंने कभी tbh लिखा है :)
AlexMorley-Finch

2
कोशिश करें github.com/tomasfejfar/enhanced-dump :)
Tomáš Fejfar

2
क्या "var_dump" को सुशोभित करने का एक तरीका है?
RPDeshaies

6
@ एलेक्समोरले-फिंच मैं आपको उठाता हूंkill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; }
फ्रांसिस्को प्रिसेंसिया

2
लिंक अविश्वसनीय वेब आर्काइव के माध्यम से "पुनर्प्राप्त करने योग्य" है , 7 '15 तक अंतिम जांच हो सकती है।
ग्रुबर

80

आप एक ऐड-ऑन फायरबग के लिए फायरबग का उपयोग जावास्क्रिप्ट के समान वातावरण में डीबग करने के लिए कर सकते हैं।

मैं प्रोफाइलिंग php के लिए पहले बताए गए Xdebug का भी उपयोग करता हूं ।


3
और यहाँ FirePHP का उपयोग करने के लिए एक त्वरित गाइड है: sitepoint.com/debug-php-firebug-firephp
Mihaela

38

यह मेरा थोड़ा डिबग वातावरण है:

error_reporting(-1);
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'assert_callcack');
set_error_handler('error_handler');
set_exception_handler('exception_handler');
register_shutdown_function('shutdown_handler');

function assert_callcack($file, $line, $message) {
    throw new Customizable_Exception($message, null, $file, $line);
}

function error_handler($errno, $error, $file, $line, $vars) {
    if ($errno === 0 || ($errno & error_reporting()) === 0) {
        return;
    }

    throw new Customizable_Exception($error, $errno, $file, $line);
}

function exception_handler(Exception $e) {
    // Do what ever!
    echo '<pre>', print_r($e, true), '</pre>';
    exit;
}

function shutdown_handler() {
    try {
        if (null !== $error = error_get_last()) {
            throw new Customizable_Exception($error['message'], $error['type'], $error['file'], $error['line']);
        }
    } catch (Exception $e) {
        exception_handler($e);
    }
}

class Customizable_Exception extends Exception {
    public function __construct($message = null, $code = null, $file = null, $line = null) {
        if ($code === null) {
            parent::__construct($message);
        } else {
            parent::__construct($message, $code);
        }
        if ($file !== null) {
            $this->file = $file;
        }
        if ($line !== null) {
            $this->line = $line;
        }
    }
}

2
धन्यवाद। जिससे मेरा दिन बच गया। (मुझे अभी उस E_STRICT को निकालना था)
Sec

4
assert_callcackहेह
मादरेक्स

32

Xdebug और भारी शुल्क बग शिकार के लिए नोटपैड ++ के लिए DBGp प्लगइन, हल्के सामान के लिए FirePHP। जल्दी और गन्दी? कुछ भी नहीं धड़कता है dBug


DBGp प्लगइन नोटपैड ++ / xdebug के वर्तमान संस्करण के साथ काम नहीं करता है और इसे ठीक करने की कोई योजना नहीं है। आप मेरी चर्चा यहाँ
जो

26

XDebug विकास के लिए आवश्यक है। मैं इसे किसी अन्य एक्सटेंशन से पहले स्थापित करता हूं। यह आपको किसी भी त्रुटि पर स्टैक के निशान देता है और आप आसानी से प्रोफाइलिंग को सक्षम कर सकते हैं।

डेटा संरचना के उपयोग पर त्वरित नज़र के लिए var_dump()। उपयोग न करें print_r()क्योंकि आपको इसे चारों ओर से घेरना होगा <pre>और यह एक समय में केवल एक संस्करण प्रिंट करता है।

<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>

एक वास्तविक डिबगिंग वातावरण के लिए मैंने जो सबसे अच्छा पाया है वह कोमोडो आईडीई है लेकिन इसकी लागत $ $ है।


19

PhpEd वास्तव में अच्छा है। आप कार्यों में / ओवर / आउट कर सकते हैं। आप एड-हॉक कोड चला सकते हैं, चर का निरीक्षण कर सकते हैं, चर बदल सकते हैं। यह आश्चर्यजनक है।


4
मैंने PhpEd का उपयोग किया है और मेरे पास NetBeans या Eclipse जैसी वास्तविक IDE की तुलना में इसके लिए कोई प्रकार के शब्द नहीं हैं, और न ही यह टिप्पणी प्रश्न के लिए कुछ भी उपयोगी है। -1
सिलिकॉनक्रॉफ्ट

मैंने PhpED प्रोफेशनल खरीदने से पहले ज्यादातर IDE (Zend, NetBeans और Eclipse सहित) की कोशिश की क्योंकि यह डेढ़ मील की दूरी से सबसे अच्छा था। यह कुछ साल पहले था, इसलिए हो सकता है कि दूसरों ने सुधार किया हो, लेकिन उस समय उनमें से ज्यादातर दर्द धीमी थे क्योंकि वे जावा में लिखे गए थे। मुझे समझ में नहीं आता है कि कैसे किसी के लिए "इसके लिए कोई प्रकार के शब्द नहीं हो सकते" जब (मेरे लिए) यह इतना स्पष्ट रूप से सबसे अच्छा था, तो निर्णय एक बिना दिमाग वाला था।
lm713

17

1) मैं print_r () का उपयोग करता हूं। TextMate में, मेरे पास 'पूर्व' के लिए एक स्निपेट है जो इस तक विस्तृत है:

echo "<pre>";
print_r();
echo "</pre>";

2) मैं Xdebug का उपयोग करता हूं, लेकिन अपने मैक पर सही काम करने के लिए GUI प्राप्त करने में सक्षम नहीं हूं। यह कम से कम स्टैक ट्रेस के एक पठनीय संस्करण को प्रिंट करता है।


मुझे यकीन है कि आप का अर्थ है गूंज "</ pre>"; हालांकि अंत में।
परिवर्तनमटिव

9
आप फ़ंक्शन में 'सही' भी पास कर सकते हैं ताकि यह स्ट्रिंग लौटाए। इसका मतलब है कि आप ऐसा कर सकते हैं:echo '<pre>', print_r($var, true), '</pre>';
अप्रकाशितGoat


16

सभी ईमानदारी में, प्रिंट और प्रिंट_आर () का एक संयोजन चर को प्रिंट करने के लिए। मुझे पता है कि कई अन्य अधिक उन्नत तरीकों का उपयोग करना पसंद करते हैं लेकिन मुझे यह उपयोग करना सबसे आसान लगता है।

मैं कहूंगा कि जब तक मैंने यूनी पर कुछ माइक्रोप्रोसेसर प्रोग्रामिंग नहीं की तब तक मैं पूरी तरह से इसकी सराहना नहीं करता था और यह भी उपयोग करने में सक्षम नहीं था।


मुझे खुशी है कि आपने प्रिंट के साथ-साथ print_r का भी उल्लेख किया है, मैं यह देखने के लिए एक मूल प्रिंट का उपयोग करता हूं कि क्या कोड एक निश्चित बिंदु पर निष्पादित होता है, जो समस्या को अलग करने में मदद करता है।
ब्रैड

मैं प्रिंट और var_dump () दोनों का उपयोग करता हूं। मैं डिबग संदेश और सूचना प्रदर्शित करने के लिए प्रिंट का उपयोग करता हूं और चीजों की प्रगति के रूप में चर की स्थिति को इंगित करने के लिए var_dump दिखाता हूं।
जोशुआ के

14

Derick Rethans द्वारा Xdebug , बहुत अच्छा है। मैंने कुछ समय पहले इसका इस्तेमाल किया था और पाया कि इसे स्थापित करना इतना आसान नहीं था। एक बार जब आप कर लेंगे, तो आप समझ नहीं पाएंगे कि आप इसके बिना कैसे प्रबंधित हुए :-)

ज़ेंड डेवलपर ज़ोन पर एक अच्छा लेख है (लिनक्स पर स्थापित करना आसान नहीं लगता) और यहां तक ​​कि फ़ायरफ़ॉक्स प्लगइन भी , जिसका मैंने कभी उपयोग नहीं किया।


2
यह स्थापित नहीं है कि निराशा होती है। ग्रहण के साथ काम करने के लिए Xdebug को कॉन्फ़िगर करना एक बुरा सपना हो सकता है। मैं Xdebug को CentOS 5 पर स्थापित करने में सक्षम था, लेकिन EclipsePDT + Xdebug न ही सहयोग करना चाहता हूं :(
जहांगीर

11

मैं XDebug के साथ Netbeans का उपयोग करता हूं। इसे कैसे कॉन्फ़िगर किया जाए, इस पर डॉक्स के लिए इसकी वेबसाइट पर देखें। http://php.netbeans.org/


11

मैं XDebug और आसान XDebug FireFox ऐड-ऑन के साथ नेटबीन्स का उपयोग करता हूं

जब आप MVC प्रोजेक्ट को डीबग करते हैं, तो ऐड-ऑन आवश्यक है, क्योंकि नेटबिन में सामान्य तरीके से XDebug चलता है, url के माध्यम से dbug सत्र को पंजीकृत करना है। फ़ायर्फ़ॉक्स में ऐड-ऑन स्थापित होने के साथ, आप अपने नेटबिन्स प्रोजेक्ट गुण सेट करेंगे -> रन कॉन्फिगरेशन -> उन्नत और "नॉट ओपन वेब ब्राउज़र का चयन करें" अब आप अपने ब्रेक पॉइंट सेट कर सकते हैं और सामान्य रूप से Ctrl-FB के साथ डिबगिंग सत्र शुरू कर सकते हैं। । फ़ायरफ़ॉक्स खोलें और ब्रेकपॉइंट के लिए निगरानी शुरू करने के लिए दाएं निचले कोने में ऐड-ऑन आइकन पर राइट-क्लिक करें। जब कोड ब्रेकपॉइंट पर पहुंच जाता है तो यह बंद हो जाएगा और आप अपने चर राज्यों और कॉल-स्टैक का निरीक्षण कर सकते हैं।


10

यदि आप अपने आउटपुट को गड़बड़ाना नहीं चाहते हैं तो आउटपुट बफरिंग बहुत उपयोगी है। मैं इसे एक-लाइनर में करता हूं, जिस पर मैं टिप्पणी कर सकता / कर सकती हूं

 ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();


9

PhpEdit में एक डीबगर में बनाया गया है, लेकिन मैं आमतौर पर इको () का उपयोग करके समाप्त होता हूं; और print_r (); पुराने तरीके से !!


8

वास्तव में किरकिरा समस्याओं के लिए, जो प्रिंट करने के लिए प्रिंट_आर / इको का उपयोग करने में बहुत समय लगेगा, मैं अपनी आईडीई (पीएचपीडी) डीबगिंग सुविधा का उपयोग करता हूं। मेरे द्वारा उपयोग किए गए अन्य IDE के विपरीत, PhpEd को बहुत अधिक सेटअप की आवश्यकता नहीं है। केवल एक ही कारण है कि मैं इसे किसी भी समस्या के लिए उपयोग नहीं करता हूं जो यह है कि यह दर्द से धीमा है। मुझे यकीन नहीं है कि सुस्ती PhpEd या किसी php डिबगर के लिए विशिष्ट है। PhpEd मुक्त नहीं है, लेकिन मेरा मानना ​​है कि यह वैसे भी ओपन-सोर्स डिबगर्स में से एक का उपयोग करता है (जैसे कि XDebug पहले उल्लेख किया गया है)। PhpEd के साथ लाभ, फिर से यह है कि इसके लिए कोई सेटअप की आवश्यकता नहीं है, जो मुझे अतीत में बहुत थकाऊ लग रहा है।


2
PHPEd डिबगर वास्तव में उसी व्यक्ति द्वारा लिखा गया है जिसने PHPEd लिखा है और मुझे पूरा यकीन है कि यह खुला स्रोत नहीं है। कम से कम PHPEd स्रोत के साथ जहाज नहीं करता है, बल्कि संकलित किया जाता है .so और .dll का।
आर्टेम रसाकोवस्की

4

मैनुअल डिबगिंग आम तौर पर मेरे लिए तेज है - var_dump()और debug_print_backtrace()वे सभी उपकरण हैं जिनके साथ आपको अपने तर्क को बांटने की आवश्यकता है।


3

खैर, कुछ हद तक यह निर्भर करता है कि चीजें दक्षिण में कहां जा रही हैं। यह पहली चीज है जिसे मैं अलग करने की कोशिश करता हूं, और फिर मैं आवश्यकतानुसार इको / प्रिंट_आर () का उपयोग करूंगा।

NB: आप लोग जानते हैं कि आप print_r () के लिए एक दूसरे तर्क के रूप में सही पास कर सकते हैं और इसे प्रिंट करने के बजाय आउटपुट वापस कर देंगे? उदाहरण के लिए:

echo "<pre>".print_r($var, true)."</pre>";

2
मैं सिर्फ डिबग नामक एक फ़ंक्शन में लपेटता हूं। तो फिर मैं डिबग ($ var) कर सकता हूं;
jdelator

3

जब रेल संभव नहीं होता है तो मैं अक्सर CakePHP का उपयोग करता हूं। त्रुटियों को डीबग करने के लिए मैं आमतौर पर error.logtmp फ़ोल्डर में पाता हूं और इसे कमांड के साथ टर्मिनल में पूंछता हूं ...

tail -f app/tmp/logs/error.log

यह आपको जो चल रहा है, उसके केक से संवाद चलाने की सुविधा देता है, जो कि बहुत आसान है, यदि आप इसे कुछ कोड आउटपुट करना चाहते हैं जो आप उपयोग कर सकते हैं।

$this->log('xxxx');

यह आमतौर पर आपको एक अच्छा विचार दे सकता है कि क्या चल रहा है / गलत है।



2

कोमोडो आईडीई xdebug के साथ अच्छी तरह से काम करता है, यहां तक ​​कि पश्च डिबगिंग के लिए भी। इसे कम से कम कॉन्फ़िगरेशन की आवश्यकता है। आपको बस php का एक संस्करण चाहिए, जिसे कोमोडो ब्रेकपॉइंट पर कोड के माध्यम से कदम रखने के लिए स्थानीय रूप से उपयोग कर सकता है। यदि आपके पास कोमोडो प्रोजेक्ट में आयात की गई स्क्रिप्ट है, तो आप माउस-क्लिक के साथ ब्रेकपॉइंट सेट कर सकते हैं कि कैसे आप इसे एक जावा प्रोग्राम डिबगिंग के लिए ग्रहण के अंदर सेट करेंगे। दूरस्थ डिबगिंग स्पष्ट रूप से इसे सही ढंग से काम करने के लिए और अधिक मुश्किल है (आपको अपने कार्यक्षेत्र में php स्क्रिप्ट के साथ रिमोट यूआरएल को मैप करना पड़ सकता है) स्थानीय डिबगिंग सेटअप की तुलना में जो कॉन्फ़िगर करने के लिए बहुत आसान है यदि आप एक मैक या लिनक्स रिकॉर्डिंग पर हैं ।



2

कई PHP डिबगिंग तकनीकें हैं जो आपको कोडिंग करते समय अनगिनत घंटे बचा सकती हैं। एक प्रभावी लेकिन बुनियादी डिबगिंग तकनीक केवल त्रुटि रिपोर्टिंग को चालू करना है। एक और थोड़ी अधिक उन्नत तकनीक में प्रिंट स्टेटमेंट का उपयोग करना शामिल है, जो स्क्रीन पर वास्तव में चल रही चीज़ों को प्रदर्शित करके अधिक मायावी कीड़े को इंगित करने में मदद कर सकता है। PHPeclipse एक ग्रहण प्लग-इन है जो सामान्य वाक्यविन्यास त्रुटियों को उजागर कर सकता है और ब्रेकपॉइंट सेट करने के लिए डीबगर के साथ संयोजन में उपयोग किया जा सकता है।

display_errors = Off
error_reporting = E_ALL 
display_errors = On

और भी इस्तेमाल किया

error_log();
console_log();

1

एक उत्पादन वातावरण में, मैं सर्वर के त्रुटि लॉग में error_log () के साथ प्रासंगिक डेटा लॉग करता हूं।


और पूंछ की तुलना में -f ... महान काम करता है
markus_p

1

मैं डिबगर में निर्मित के साथ ग्रहण के लिए ज़ेंड स्टूडियो का उपयोग करता हूं। इसकी अभी भी धीमी गति से xdebug के साथ ग्रहण pdt के साथ डिबगिंग की तुलना में। उम्मीद है कि वे उन मुद्दों को ठीक कर देंगे, हालिया रिलीज पर गति में सुधार हुआ है लेकिन अभी भी चीजों पर कदम रखने में 2-3 सेकंड लगते हैं। Zend फ़ायरफ़ॉक्स टूलबार वास्तव में चीजों को आसान बनाता है (अगले पृष्ठ, वर्तमान पृष्ठ आदि पर डिबग करें)। इसके अलावा यह एक प्रोफाइलर प्रदान करता है जो आपके कोड को बेंचमार्क करेगा और पाई-चार्ट, निष्पादन समय आदि प्रदान करेगा।


1

अधिकांश कीड़ों को आसानी से var_dumpकुछ प्रमुख चर के द्वारा आसानी से पाया जा सकता है , लेकिन यह स्पष्ट रूप से इस बात पर निर्भर करता है कि आप किस तरह का अनुप्रयोग विकसित करते हैं।

अधिक जटिल एल्गोरिदम के लिए स्टेप / ब्रेकपॉइंट / वॉच फ़ंक्शन बहुत मददगार हैं (यदि आवश्यक नहीं है)


1

PHP DBG

SAPI मॉड्यूल के रूप में लागू किया गया इंटरएक्टिव स्टेपथ PHP PHP डिबगर जो आपके कोड की कार्यक्षमता या प्रदर्शन को प्रभावित किए बिना आपको पर्यावरण पर पूर्ण नियंत्रण दे सकता है। यह PHP 5.4+ के लिए डिबगिंग प्लेटफॉर्म का उपयोग करने के लिए एक हल्का, शक्तिशाली, आसान होने का लक्ष्य रखता है और इसे PHP 5.6 के साथ आउट-ऑफ-बॉक्स भेज दिया जाता है।

सुविधाओं में शामिल हैं:

  • स्टेपथ्रू डिबगिंग
  • लचीले ब्रेकपॉइंट (क्लास मेथड, फंक्शन, फाइल: लाइन, एड्रेस, ओपकोड)
  • अंतर्निहित eval () के साथ PHP तक आसान पहुँच
  • वर्तमान में निष्पादन कोड के लिए आसान पहुँच
  • यूजरलैंड एपीआई
  • SAPI अज्ञेय - आसानी से एकीकृत
  • PHP कॉन्फ़िगरेशन फ़ाइल समर्थन
  • JIT सुपर ग्लोबल्स - अपना खुद का सेट करें !!
  • वैकल्पिक रीडलाइन समर्थन - आरामदायक टर्मिनल ऑपरेशन
  • दूरस्थ डिबगिंग समर्थन - बंडल किए गए जावा GUI
  • आसान कामकाज

स्क्रीनशॉट देखें:

PHP DBG - स्टेप्रिथ डिबगिंग - स्क्रीनशॉट

PHP DBG - स्टेप्रिथ डिबगिंग - स्क्रीनशॉट

मुख पृष्ठ: http://phpdbg.com/

PHP त्रुटि - PHP के लिए बेहतर त्रुटि रिपोर्टिंग

अपनी PHP स्क्रिप्ट को डीबग करने के लिए लाइब्रेरी (वास्तव में एक फ़ाइल) का उपयोग करना बहुत आसान है।

केवल एक चीज जो आपको करने की ज़रूरत है, वह है नीचे के रूप में एक फ़ाइल को शामिल करना (अपने कोड पर शुरुआत में):

require('php_error.php');
\php_error\reportErrors();

तब सभी त्रुटियां आपको जानकारी प्रदान करेंगी जैसे कि बैकट्रेस, कोड संदर्भ, फ़ंक्शन तर्क, सर्वर चर, आदि। उदाहरण के लिए:

PHP त्रुटि |  PHP के लिए त्रुटि रिपोर्टिंग में सुधार - बैकट्रेस का स्क्रीनशॉट PHP त्रुटि |  PHP के लिए त्रुटि रिपोर्टिंग में सुधार - बैकट्रेस का स्क्रीनशॉट PHP त्रुटि |  PHP के लिए त्रुटि रिपोर्टिंग में सुधार - बैकट्रेस का स्क्रीनशॉट

विशेषताओं में शामिल:

  • तुच्छ उपयोग करने के लिए, यह सिर्फ एक फ़ाइल है
  • सामान्य और ajaxy अनुरोधों के लिए ब्राउज़र में प्रदर्शित त्रुटियाँ
  • AJAX अनुरोधों को रोक दिया जाता है, जिससे आप उन्हें स्वचालित रूप से पुनः चला सकते हैं
  • यथासंभव गलतियाँ करता है (कोड गुणवत्ता को प्रोत्साहित करता है, और प्रदर्शन में सुधार करता है)
  • पूरे स्टैक ट्रेस में कोड स्निपेट
  • अधिक जानकारी प्रदान करता है (जैसे पूर्ण फ़ंक्शन हस्ताक्षर)
  • कुछ त्रुटि संदेशों को ठीक करता है जो केवल सीधे गलत हैं
  • वाक्य - विन्यास पर प्रकाश डालना
  • सुंदर लग रहा है!
  • अनुकूलन
  • इसे मैन्युअल रूप से चालू और बंद करें
  • त्रुटि रिपोर्टिंग के बिना विशिष्ट अनुभाग चलाएं
  • अपने स्टैक ट्रेस में हाइलाइटिंग कोड से बचने की अनुमति देने वाली फ़ाइलों को अनदेखा करें
  • आवेदन फाइलें; जब कोई त्रुटि होती है तो इन्हें प्राथमिकता दी जाती है!

मुख पृष्ठ: http://phperror.net/

GitHub: https://github.com/JosephLenton/PHP-Error

मेरा कांटा (अतिरिक्त सुधार के साथ): https://github.com/kenorb-contrib/PHP-Error

DTrace

यदि आपका सिस्टम DTrace डायनेमिक ट्रेसिंग (OS X पर डिफ़ॉल्ट रूप से स्थापित) का समर्थन करता है और आपके PHP को सक्षम किए गए DTTB (संभावित --enable-dtrace) के साथ संकलित किया गया है, जो कि डिफ़ॉल्ट रूप से होना चाहिए, तो यह कमांड बिना समय के साथ PHP स्क्रिप्ट को डीबग करने में आपकी मदद कर सकता है:

sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'

इसलिए दिए गए उपनामों को आपकी आरसी फाइलों (जैसे ~/.bashrc, ~/.bash_aliases) में जोड़ा गया है :

alias trace-php='sudo dtrace -qn "php*:::function-entry { printf(\"%Y: PHP function-entry:\t%s%s%s() in %s:%d\n\", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }"'

आप आसानी से उर्फ ​​को याद करने के साथ अपनी स्क्रिप्ट का पता लगा सकते हैं trace-php:।

यहां अधिक उन्नत dtrace स्क्रिप्ट है, बस इसे सहेजें dtruss-php.d, इसे निष्पादन योग्य बनाएं ( chmod +x dtruss-php.d) और चलाएँ:

#!/usr/sbin/dtrace -Zs
# See: https://github.com/kenorb/dtruss-lamp/blob/master/dtruss-php.d

#pragma D option quiet

php*:::compile-file-entry
{
    printf("%Y: PHP compile-file-entry:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1));
}

php*:::compile-file-return
{
    printf("%Y: PHP compile-file-return:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), basename(copyinstr(arg1)));
}

php*:::error
{
    printf("%Y: PHP error message:\t%s in %s:%d\n", walltimestamp, copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::exception-caught
{
    printf("%Y: PHP exception-caught:\t%s\n", walltimestamp, copyinstr(arg0));
}

php*:::exception-thrown
{
    printf("%Y: PHP exception-thrown:\t%s\n", walltimestamp, copyinstr(arg0));
}

php*:::execute-entry
{
    printf("%Y: PHP execute-entry:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}

php*:::execute-return
{
    printf("%Y: PHP execute-return:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}

php*:::function-entry
{
    printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::function-return
{
    printf("%Y: PHP function-return:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::request-shutdown
{
    printf("%Y: PHP request-shutdown:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}

php*:::request-startup
{
    printf("%Y, PHP request-startup:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}

मुख पृष्ठ: GitHub पर dtruss-lamp

यहाँ सरल उपयोग है:

  1. चलाएँ: sudo dtruss-php.d
  2. एक और टर्मिनल रन पर php -r "phpinfo();":।

परीक्षण करने के लिए, आप किसी भी डॉक्टर के पास जा सकते हैं index.phpऔर इसके द्वारा PHP अंतर्निहित सर्वर चला सकते हैं :

php -S localhost:8080

उसके बाद आप http: // localhost: 8080 / पर साइट तक पहुँच सकते हैं (या जो भी पोर्ट आपके लिए सुविधाजनक हो उसे चुनें) । ट्रेस आउटपुट देखने के लिए कुछ पृष्ठों तक पहुँच से।

नोट: Dtrace डिफ़ॉल्ट रूप से OS X पर उपलब्ध है, लिनक्स पर आपको शायद dtrace4linux की जरूरत है या कुछ अन्य विकल्पों की जाँच करें

देखें: php.net पर PHP और DTrace का उपयोग करना


SystemTap

SystemTap SDT डेवलपमेंट पैकेज (उदा yum install systemtap-sdt-devel ) ।

यहाँ उदाहरण स्क्रिप्ट ( all_probes.stp) SystemTap के साथ चल रहे PHP स्क्रिप्ट की अवधि के दौरान सभी कोर PHP स्थिर जांच बिंदुओं को ट्रेस करने के लिए है:

probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
    printf("Probe compile__file__entry\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
    printf("Probe compile__file__return\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
    printf("Probe error\n");
    printf("  errormsg %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
    printf("Probe exception__caught\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
    printf("Probe exception__thrown\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
    printf("Probe execute__entry\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
    printf("Probe execute__return\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
    printf("Probe function__entry\n");
    printf("  function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
    printf("Probe function__return: %s\n", user_string($arg1));
    printf(" function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
    printf("Probe request__shutdown\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
    printf("Probe request__startup\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}

उपयोग:

stap -c 'sapi/cli/php test.php' all_probes.stp

देखें: php.net पर PHP DTrace Static Probes के साथ SystemTap का उपयोग करना


0

Print_r () के लिए +1। किसी वस्तु या चर की सामग्री को डंप करने के लिए इसका उपयोग करें। इसे और अधिक पठनीय बनाने के लिए, इसे पूर्व टैग के साथ करें ताकि आपको स्रोत देखने की आवश्यकता न हो।

echo '<pre>';
print_r($arrayOrObject);

इसके अलावा var_dump ($ चीज) - यह सबटिंग के प्रकार को देखने के लिए बहुत उपयोगी है


एक विस्तारित संस्करण यहां पाया जा सकता है devarticles.in/php/useful-function-to-output-debug-data-in-php
Arvind K.

यहां एक परिष्कृत संस्करण devarticles.in/php/useful-function-to-output-debug-data-in-php
अरविंद के।

0

इस मुद्दे पर निर्भर करता है कि मुझे इको टेस्ट्स के साथ मिश्रित error_reporting (E_ALL) का संयोजन पसंद है (आक्रामक लाइन को खोजने के लिए / गलती से हुई फाइल? आप जानते हैं कि यह हमेशा लाइन नहीं होती है / फाइल php आपको सही बताता है?), IDE ब्रेस मिलान ("पार्स त्रुटि: वाक्यविन्यास त्रुटि, अप्रत्याशित $ अंत" मुद्दों को हल करने के लिए), और print_r (); बाहर जाएं; डंप (वास्तविक प्रोग्रामर स्रोत देखें; पी)।

आप phpdebug (check sourceforge) को "memory_get_usage ();" से नहीं हरा सकते हैं और "memory_get_peak_usage ();" समस्या क्षेत्रों को खोजने के लिए।


0

एकीकृत डिबगर्स जहां आप चर परिवर्तन के मूल्यों को देख सकते हैं क्योंकि आप कोड के माध्यम से कदम रखते हैं वे वास्तव में शांत हैं। हालाँकि, उन्हें सर्वर पर सॉफ़्टवेयर सेटअप और क्लाइंट पर निश्चित मात्रा में कॉन्फ़िगरेशन की आवश्यकता होती है। दोनों को अच्छे कार्य क्रम में रखने के लिए समय-समय पर रखरखाव की आवश्यकता होती है।

Print_r लिखना आसान है और किसी भी सेटअप में काम करने की गारंटी है।


0

आमतौर पर मुझे लगता है कि फ़ाइल पर सहेजने, डीबग जानकारी संग्रहीत करने और अंततः एक सामान्य पाद लेख पर पुनः प्रिंट करने में सक्षम कस्टम लॉग फ़ंक्शन बनाएँ।

आप सामान्य अपवाद वर्ग को भी ओवरराइड कर सकते हैं, ताकि इस प्रकार की डीबगिंग अर्द्ध स्वचालित हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.