উত্তর:
আপনি যদি ব্যাকট্রিজ উত্পন্ন করতে চান তবে আপনি debug_backtrace
এবং / অথবা সন্ধান করছেনdebug_print_backtrace
।
উদাহরণস্বরূপ, প্রথমটি আপনাকে এর মতো একটি অ্যারে দেবে (ম্যানুয়ালটির উদ্ধৃতি দিয়ে) :
array(2) {
[0]=>
array(4) {
["file"] => string(10) "/tmp/a.php"
["line"] => int(10)
["function"] => string(6) "a_test"
["args"]=>
array(1) {
[0] => &string(6) "friend"
}
}
[1]=>
array(4) {
["file"] => string(10) "/tmp/b.php"
["line"] => int(2)
["args"] =>
array(1) {
[0] => string(10) "/tmp/a.php"
}
["function"] => string(12) "include_once"
}
}
তারা স্পষ্টতই I / O বাফারটি ফ্লাশ করবেন না, তবে আপনি flush
এবং / অথবা দিয়ে নিজেরাই তা করতে পারেন ob_flush
।
("এবং / অথবা" ;-) কেন, এটি সন্ধানের জন্য প্রথমটির ম্যানুয়াল পৃষ্ঠাটি দেখুন)
এর চেয়ে বেশি পঠনযোগ্য debug_backtrace()
:
$e = new \Exception;
var_dump($e->getTraceAsString());
#2 /usr/share/php/PHPUnit/Framework/TestCase.php(626): SeriesHelperTest->setUp()
#3 /usr/share/php/PHPUnit/Framework/TestResult.php(666): PHPUnit_Framework_TestCase->runBare()
#4 /usr/share/php/PHPUnit/Framework/TestCase.php(576): PHPUnit_Framework_TestResult->run(Object(SeriesHelperTest))
#5 /usr/share/php/PHPUnit/Framework/TestSuite.php(757): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult))
#6 /usr/share/php/PHPUnit/Framework/TestSuite.php(733): PHPUnit_Framework_TestSuite->runTest(Object(SeriesHelperTest), Object(PHPUnit_Framework_TestResult))
#7 /usr/share/php/PHPUnit/TextUI/TestRunner.php(305): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false)
#8 /usr/share/php/PHPUnit/TextUI/Command.php(188): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array)
#9 /usr/share/php/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true)
#10 /usr/bin/phpunit(53): PHPUnit_TextUI_Command::main()
#11 {main}"
debug_backtrace
স্ট্যাকট্রেসে কেবল প্রথম স্তরের ফিরে আসার সীমাবদ্ধ করার উপায় খুঁজছিলাম - এই সমাধানটি আমার পক্ষে কাজ করে। ধন্যবাদ!
print_r
সমস্ত বার্তা ধরে রাখবে।
ব্যাকট্রেস পুরো আপনার প্রয়োজনীয় আবর্জনা ফেলে দেয় you এটি পড়া খুব দীর্ঘ, পড়া কঠিন। আপনি যে সবসময় ব্যবহার করতে চান তা হ'ল "কোথা থেকে কী বলা হয়?" এখানে একটি সহজ স্ট্যাটিক ফাংশন সমাধান। আমি সাধারণত এটি 'ডিবাগ' নামে একটি শ্রেণিতে রাখি, এতে আমার সমস্ত ডিবাগিং ইউটিলিটি ফাংশন রয়েছে।
class debugUtils {
public static function callStack($stacktrace) {
print str_repeat("=", 50) ."\n";
$i = 1;
foreach($stacktrace as $node) {
print "$i. ".basename($node['file']) .":" .$node['function'] ."(" .$node['line'].")\n";
$i++;
}
}
}
আপনি এটিকে এভাবে বলেছেন:
debugUtils::callStack(debug_backtrace());
এবং এটি এই জাতীয় আউটপুট উত্পাদন করে:
==================================================
1. DatabaseDriver.php::getSequenceTable(169)
2. ClassMetadataFactory.php::loadMetadataForClass(284)
3. ClassMetadataFactory.php::loadMetadata(177)
4. ClassMetadataFactory.php::getMetadataFor(124)
5. Import.php::getAllMetadata(188)
6. Command.php::execute(187)
7. Application.php::run(194)
8. Application.php::doRun(118)
9. doctrine.php::run(99)
10. doctrine::include(4)
==================================================
আশ্চর্যের বিষয় যে দুপুরে এইভাবে পোস্ট করা হয়নি:
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
এটি আসলে আবর্জনা ছাড়াই ব্যাকট্রেস ছাপায় - ঠিক কী পদ্ধতিটি ডাকা হয়েছিল এবং কোথায়।
আপনি যদি একটি স্ট্যাক ট্রেস চান যা php কীভাবে এই ফাংশনটি ব্যবহার না করে ব্যতিক্রম স্ট্যাক ট্রেসটিকে বিন্যাস করে তার সাথে খুব মিল দেখায়:
function debug_backtrace_string() {
$stack = '';
$i = 1;
$trace = debug_backtrace();
unset($trace[0]); //Remove call to this function from stack trace
foreach($trace as $node) {
$stack .= "#$i ".$node['file'] ."(" .$node['line']."): ";
if(isset($node['class'])) {
$stack .= $node['class'] . "->";
}
$stack .= $node['function'] . "()" . PHP_EOL;
$i++;
}
return $stack;
}
এটি এমন স্ট্যাক ট্রেস ফর্ম্যাট করে ফিরে আসবে:
#1 C:\Inetpub\sitename.com\modules\sponsors\class.php(306): filePathCombine()
#2 C:\Inetpub\sitename.com\modules\sponsors\class.php(294): Process->_deleteImageFile()
#3 C:\Inetpub\sitename.com\VPanel\modules\sponsors\class.php(70): Process->_deleteImage()
#4 C:\Inetpub\sitename.com\modules\sponsors\process.php(24): Process->_delete()
$e = new Exception; echo $e->getTraceAsString();
দেখুন debug_print_backtrace
। আমার ধারণা আপনি flush
যদি চান তবে পরে কল করতে পারেন।
phptraceআপনি কোনও এক্সটেনশান ইনস্টল না করে যখনই চাইলে পিএইচপি স্ট্যাক মুদ্রণের জন্য একটি দুর্দান্ত সরঞ্জাম।
Phptrace এর দুটি প্রধান ফাংশন রয়েছে: প্রথমত, পিএইচপি এর প্রিন্ট কল স্ট্যাক যা কিছু ইনস্টল করতে হবে না, দ্বিতীয়ত, পিএইচপি এক্সপি এক্সিকিউশন ফ্লো যা এটি সরবরাহ করে সেই এক্সটেনশনটি ইনস্টল করতে হবে।
নিম্নরূপ:
$ ./phptrace -p 3130 -s # phptrace -p <PID> -s
phptrace 0.2.0 release candidate, published by infra webcore team
process id = 3130
script_filename = /home/xxx/opt/nginx/webapp/block.php
[0x7f27b9a99dc8] sleep /home/xxx/opt/nginx/webapp/block.php:6
[0x7f27b9a99d08] say /home/xxx/opt/nginx/webapp/block.php:3
[0x7f27b9a99c50] run /home/xxx/opt/nginx/webapp/block.php:10
debug_backtrace
কোন ফাংশন এবং পদ্ধতিগুলি ডাকা হয়েছিল এবং কোন ফাইলগুলি অন্তর্ভুক্ত করা হয়েছিল সেটির ব্যাকট্রেস পেতে ব্যবহার debug_backtrace
করা হয়েছে যেখানে ডাকা হয়েছে।
দয়া করে এই ব্যবহার শ্রেণীর দিকে একবার নজর দিন, সহায়ক হতে পারে:
ব্যবহার:
<?php
/* first caller */
Who::callme();
/* list the entire list of calls */
Who::followme();
উত্স শ্রেণি: https://github.com/augustowebd/utils/blob/master/Who.php
আপনি সন্ধান করতে পারেন debug_backtrace
বা সম্ভবত debug_print_backtrace
।
ওয়ালটিয়ারের সমাধানটি দুর্দান্ত, বিশেষত যদি একটি 'প্রাক' ট্যাগে আবদ্ধ থাকে:
<pre>
<?php debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); ?>
</pre>
- যা পৃথক লাইনে কল সেট করে, খুব সুন্দরভাবে নাম্বারযুক্ত
আমি পাবলিক প্রিন্টিংয়ের পরিবর্তে অভ্যন্তরীণ ত্রুটি লগিং ব্যবহার করতে উপরে ডন ব্রিগসের উত্তরটি অভিযোজিত করেছি , যা কোনও লাইভ সার্ভারে কাজ করার সময় আপনার বড় উদ্বেগ হতে পারে। এছাড়াও, মৌলিক নামের পরিবর্তে পুরো ফাইল পাথ অন্তর্ভুক্ত করার বিকল্প হিসাবে আরও কয়েকটি পরিবর্তন যুক্ত করা হয়েছে (কারণ, বিভিন্ন পথে একই নামে ফাইল থাকতে পারে), এবং (যাদের এটি প্রয়োজন তাদের জন্য) একটি সম্পূর্ণ নোড স্ট্যাক আউটপুট:
class debugUtils {
public static function callStack($stacktrace) {
error_log(str_repeat("=", 100));
$i = 1;
foreach($stacktrace as $node) {
// uncomment next line to debug entire node stack
// error_log(print_r($node, true));
error_log( $i . '.' . ' file: ' .$node['file'] . ' | ' . 'function: ' . $node['function'] . '(' . ' line: ' . $node['line'] . ')' );
$i++;
}
error_log(str_repeat("=", 100));
}
}
// call debug stack
debugUtils::callStack(debug_backtrace());