php - 如何让 PHP 在错误时产生回溯?

标签 php debugging error-handling stack-trace backtrace

尝试使用其默认的仅限当前行的错误消息来调试 PHP 是可怕的。产生错误时如何让 PHP 产生回溯(堆栈跟踪)?

最佳答案

我用于安装产生回溯的错误处理程序的脚本:

<?php
function process_error_backtrace($errno, $errstr, $errfile, $errline, $errcontext) {
    if(!(error_reporting() & $errno))
        return;
    switch($errno) {
    case E_WARNING      :
    case E_USER_WARNING :
    case E_STRICT       :
    case E_NOTICE       :
    case E_USER_NOTICE  :
        $type = 'warning';
        $fatal = false;
        break;
    default             :
        $type = 'fatal error';
        $fatal = true;
        break;
    }
    $trace = array_reverse(debug_backtrace());
    array_pop($trace);
    if(php_sapi_name() == 'cli') {
        echo 'Backtrace from ' . $type . ' \'' . $errstr . '\' at ' . $errfile . ' ' . $errline . ':' . "\n";
        foreach($trace as $item)
            echo '  ' . (isset($item['file']) ? $item['file'] : '<unknown file>') . ' ' . (isset($item['line']) ? $item['line'] : '<unknown line>') . ' calling ' . $item['function'] . '()' . "\n";
    } else {
        echo '<p class="error_backtrace">' . "\n";
        echo '  Backtrace from ' . $type . ' \'' . $errstr . '\' at ' . $errfile . ' ' . $errline . ':' . "\n";
        echo '  <ol>' . "\n";
        foreach($trace as $item)
            echo '    <li>' . (isset($item['file']) ? $item['file'] : '<unknown file>') . ' ' . (isset($item['line']) ? $item['line'] : '<unknown line>') . ' calling ' . $item['function'] . '()</li>' . "\n";
        echo '  </ol>' . "\n";
        echo '</p>' . "\n";
    }
    if(ini_get('log_errors')) {
        $items = array();
        foreach($trace as $item)
            $items[] = (isset($item['file']) ? $item['file'] : '<unknown file>') . ' ' . (isset($item['line']) ? $item['line'] : '<unknown line>') . ' calling ' . $item['function'] . '()';
        $message = 'Backtrace from ' . $type . ' \'' . $errstr . '\' at ' . $errfile . ' ' . $errline . ': ' . join(' | ', $items);
        error_log($message);
    }
    if($fatal)
        exit(1);
}

set_error_handler('process_error_backtrace');
?>

警告:它无力影响各种'PHP Fatal Errors' ,因为 Zend 在他们的智慧中决定这些将忽略 set_error_handler()。因此,您仍然会遇到无用的仅限最终位置的错误。

关于php - 如何让 PHP 在错误时产生回溯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1159216/

相关文章:

php - SQL 更新查询无法正确处理 php 数据

.htaccess - .htaccess不会重定向到错误页面

java - Magento OPC 继续按钮不起作用

android - 在 Android 中将日志输出到控制台

debugging - 如何在浏览器中调试Dojo?

c# - 处理 Task 中的异常

php - WAMP不显示mySQL错误

php - Codeigniter 从哪里选择

javascript - 不打印控制台日志

php - 您在 codeigniter 中指定了无效的数据库连接组