Introduction
As promised, back with the 2nd utility function for Magento (printDebugBacktrace).
This function will help you to print the backtrace. As you know that Magento has so many classes and flow/interlinking of those classes’ methods are really vague. So this function will help you to debug/trace in such cases.
printDebugBacktrace function looks like:
public static function printDebugBacktrace($title = 'Debug Backtrace:') {
$output = "";
$output .= "<hr /><div>" . $title . '<br /><table border="1" cellpadding="2" cellspacing="2">';
$stacks = debug_backtrace();
$output .= "<thead><tr><th><strong>File</strong></th><th><strong>Line</strong></th><th><strong>Function</strong></th>".
"</tr></thead>";
foreach($stacks as $_stack)
{
if (!isset($_stack['file'])) $_stack['file'] = '[PHP Kernel]';
if (!isset($_stack['line'])) $_stack['line'] = '';
$output .= "<tr><td>{$_stack["file"]}</td><td>{$_stack["line"]}</td>".
"<td>{$_stack["function"]}</td></tr>";
}
$output .= "</table></div><hr /></p>";
return $output;
}
You need to put the above method in app/Mage.php.
Note: As you see that above method utilizes the PHP’s debug_backtrace() method. But manually calling that function will give you very large string due to large no of complex properties & nested objects in Magento classes, and will be very difficult in tracing. So it’s recommended to use the above-mentioned utility function instead.
Usage
Suppose say you are trying to figure out the flow of
Mage_Sales_Model_Quote_Address_Total_Shipping::collect()
method.
Go to that class method and put the following line
public function collect(Mage_Sales_Model_Quote_Address $address)
{
echo Mage::printDebugBacktrace(); exit; //add this line just after the opening
//Mage::log(Mage::printDebugBacktrace(), null, 'backtrace.log'); //or you can even log the backtrace
And when you load the page (my cart) in frontend then you will get the following output:
Isn’t that very helpful to know the flow and debug accordingly?
Good Luck with Magento Debugging.
EDIT:
After this article was written, found that we can do the very same thing using the following inbuilt method:
Varien_Debug::backtrace()
Whose arguments are as:
/**
* Prints or return a backtrace
*
* @param bool $return return or print
* @param bool $html output in HTML format
* @param bool $withArgs add short argumets of methods
* @return string|bool
*/
public static function backtrace($return = false, $html = true, $withArgs = true)
So now you can simply call as
echo Varien_Debug::backtrace(true, true); exit;
//or
Mage::log(Varien_Debug::backtrace(true, true), null, 'backtrace.log');