किसी भी "बग", "फीचर" के बावजूद, जो कुछ भी PHP बनाए रखने वाले लोग कहना चाहते हैं, डीबग_बैकट्रैस() काम नहीं करेगा जैसा मैं उम्मीद करता हूं।
यहाँ मेरी समाधान (यह बदसूरत है, लेकिन यह मेरे लिए काम करता है):
function dbg($msg="")
{
ob_start();
debug_print_backtrace(0,1);
$_ = ob_get_clean();
list($ignore,$line_number) = explode(':', $_);
$line_number += 0;
$backtrace = debug_backtrace(0);
extract($backtrace[1]);
echo "<pre>$class::$function($msg) : $line_number</pre>";
}
पीएचपी समारोह debug_print_backtrace (0,1); कुछ इस तरह का उत्पादन करेगा: केवल ट्रेस इको
# 0 dbg-> पिंग (290) [/path/to/filename.php:290]
पर कहा जाता है यह बाद से, मैं ob_get_clean करने के लिए है() यह एक स्ट्रिंग के रूप में। तब मैं इसे पार्स करता हूं।
मेरे कार्यान्वयन में, मैं केवल कॉलिंग फ़ंक्शन से कक्षा, फ़ंक्शन, लाइन नंबर और वैकल्पिक रूप से एक स्ट्रिंग संदेश जानना चाहता हूं। debug_backtrace() कक्षा और कार्य सही तरीके से प्रदान करता है, लेकिन लाइन-संख्या नहीं। यही कारण है कि मुझे debug_print_backtrace() फ़ंक्शन से लाइन नंबर प्राप्त करना होगा।
बोनस अंक के लिए .... यह कैसे है कि debug_print_backtrace() फ़ंक्शन लाइन नंबर "जानता है", लेकिन debug_backtrace() [कभी-कभी] नहीं करता है, आह ??? ... यह एक रहस्य है ...
स्रोत
2013-03-04 20:29:06
दिलचस्प। क्या आप एक उदाहरण पोस्ट कर सकते हैं? – deceze
क्या यह शायद एक अपवाद, बंद, evaled कोड, टिक कार्य, त्रुटि हैंडलर, (मूल रूप से कोई भी कोड जो सामान्य निष्पादन ढेर से संचालित है) के अंदर है? इसके अलावा, मैं नहीं देख सकता कि आपको लाइन नंबर क्यों नहीं मिलेगा (कम से कम उदाहरण के बिना) ... – ircmaxell
@deceze - कोड एक उदाहरण पोस्ट करने के लिए बहुत जटिल है। काश मैं कर सकता था लेकिन पोस्ट करने के लिए पर्याप्त कुछ आसान पहचानने में घंटों या अधिक समय लगेगा और यह उस समय खर्च करने के लिए मेरे लिए बड़ी समस्या नहीं है। – MikeSchinkel