পিএইচপি কল স্ট্যাক প্রিন্ট করুন


257

আমি পিএইচপি-তে কল স্ট্যাক প্রিন্ট করার জন্য একটি উপায় খুঁজছি।

ফাংশনটি আইও বাফারটি ফ্লাশ করলে বোনাস পয়েন্ট।



12
... তবে এই প্রতিক্রিয়াগুলি আরও ভাল।
বেন

উত্তর:


123

আপনি যদি ব্যাকট্রিজ উত্পন্ন করতে চান তবে আপনি 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

("এবং / অথবা" ;-) কেন, এটি সন্ধানের জন্য প্রথমটির ম্যানুয়াল পৃষ্ঠাটি দেখুন)


7
এটি নিয়মিত আমার পিএইচপি স্মৃতি থেকে দূরে। আমি টোবিয়াস সমাধান সমাধানের পরামর্শ দিচ্ছি।
পেডি

আপনার যদি পড়তে / বুঝতে অসুবিধা হয় তবে আমি টোবিয়াসের সমাধান
ভিলিয়াসএল

1
@ পেডি যা লাগে তা হ'ল ;চ্ছিক DEBUG_BACKTRACE_IGNORE_ARGSপ্যারামিটারগুলির একটি সরবরাহ করা; এটি তাদের কার্যকারিতা সমান করে তোলে(new \Exception())->getTraceAsString()

565

এর চেয়ে বেশি পঠনযোগ্য 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}"

50
ধিক্কার, এটি এত বেশি ভাল, তারা কেন এটি ডিবাগ_প্রিন্ট_ব্যাক্ট্রেস () এর জন্য ডিফল্ট আউটপুট তৈরি করতে পারেনি? প্রতিধ্বনিত না করে যারা এটি পরিবর্তনশীলতে চান তাদের জন্য একটি বুলিয়ান প্যারামিটার "রিটার্নট্রেস" যুক্ত করতে পারতেন এবং এটি নিখুঁত হত!
জুরচিক্স

1
আমি জানি না যে আমি কীভাবে এটি করতে পারি তা কখনই ভাবতে পারি না যে এটি কখনই কার্যকর হবে
WojonsTech

এই সমাধানটি ডিবেগ_ব্যাকট্রেস () এর অ্যারে হিসাবে আউটপুট ক্যাপচারের চেয়ে কম মেমরি নিয়েছে এবং তারপরে মুদ্রণ_আর () ব্যবহার করে এটি মুদ্রণ করে যা আমি এটি না হওয়া পর্যন্ত করছিলাম!
পিটার

5
আমি debug_backtraceস্ট্যাকট্রেসে কেবল প্রথম স্তরের ফিরে আসার সীমাবদ্ধ করার উপায় খুঁজছিলাম - এই সমাধানটি আমার পক্ষে কাজ করে। ধন্যবাদ!
অ্যাঙ্কার

3
@ অ্যান্ড্রু print_rসমস্ত বার্তা ধরে রাখবে।
mopo922

41

ট্রেস লগ ইন করতে

$e = new Exception;
error_log(var_export($e->getTraceAsString(), true));

ধন্যবাদ @ টোবিয়াস


35

ব্যাকট্রেস পুরো আপনার প্রয়োজনীয় আবর্জনা ফেলে দেয় 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)
==================================================


33

আশ্চর্যের বিষয় যে দুপুরে এইভাবে পোস্ট করা হয়নি:

debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);

এটি আসলে আবর্জনা ছাড়াই ব্যাকট্রেস ছাপায় - ঠিক কী পদ্ধতিটি ডাকা হয়েছিল এবং কোথায়।


2
প্রকৃতপক্ষে, ভোটদানের মূল সমাধানের পক্ষে সত্যই সমান এবং খাটো। ধন্যবাদ
ব্রুনেটন

9

আপনি যদি একটি স্ট্যাক ট্রেস চান যা 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() 

2
বা কেবল$e = new Exception; echo $e->getTraceAsString();
ব্র্যাড কেন্ট

ব্র্যাড, সেই সমাধানটি স্ট্যাক ট্রেস থেকে শেষ আইটেমটি সরিয়ে ফেলবে না যাতে আপনি নতুন ব্যতিক্রমের কারণে তৈরি ট্রেস আইটেমটি প্রদর্শন করবেন না
ট্রয়স্টেভেন



4

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 

উইন্ডোজ সংস্করণ আছে?
জনি

আমি এখানে মেমরি ঠিকানা দেখানো পছন্দ করি .. এটি সহায়ক হতে পারে
টাইলার মাইলস

3

debug_backtraceকোন ফাংশন এবং পদ্ধতিগুলি ডাকা হয়েছিল এবং কোন ফাইলগুলি অন্তর্ভুক্ত করা হয়েছিল সেটির ব্যাকট্রেস পেতে ব্যবহার debug_backtraceকরা হয়েছে যেখানে ডাকা হয়েছে।





1

ওয়ালটিয়ারের সমাধানটি দুর্দান্ত, বিশেষত যদি একটি 'প্রাক' ট্যাগে আবদ্ধ থাকে:

<pre>
<?php debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); ?>
</pre>

- যা পৃথক লাইনে কল সেট করে, খুব সুন্দরভাবে নাম্বারযুক্ত


0

আমি পাবলিক প্রিন্টিংয়ের পরিবর্তে অভ্যন্তরীণ ত্রুটি লগিং ব্যবহার করতে উপরে ডন ব্রিগসের উত্তরটি অভিযোজিত করেছি , যা কোনও লাইভ সার্ভারে কাজ করার সময় আপনার বড় উদ্বেগ হতে পারে। এছাড়াও, মৌলিক নামের পরিবর্তে পুরো ফাইল পাথ অন্তর্ভুক্ত করার বিকল্প হিসাবে আরও কয়েকটি পরিবর্তন যুক্ত করা হয়েছে (কারণ, বিভিন্ন পথে একই নামে ফাইল থাকতে পারে), এবং (যাদের এটি প্রয়োজন তাদের জন্য) একটি সম্পূর্ণ নোড স্ট্যাক আউটপুট:

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());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.