Bất kể "lỗi", "tính năng", bất kể những người duy trì PHP muốn nói, debug_backtrace() không hoạt động như tôi mong đợi.
Đây là giải pháp của tôi (nó là xấu xí, nhưng nó làm việc cho tôi):
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>";
}
Chức năng PHP debug_print_backtrace (0,1); sẽ tạo ra một cái gì đó như thế này:
# 0 dbg-> ping (290) gọi tại [/path/to/filename.php:290]
Vì nó chỉ echos các dấu vết, tôi phải ob_get_clean() nó như một chuỗi. Sau đó tôi phân tích nó.
Trong quá trình triển khai, tôi chỉ muốn biết lớp, chức năng, số dòng và tùy chọn, một thông báo chuỗi từ chức năng gọi. debug_backtrace() cung cấp lớp và hàm đúng, nhưng không cung cấp số dòng. Đó là lý do tại sao tôi phải lấy số dòng từ hàm debug_print_backtrace().
Đối với điểm thưởng .... làm thế nào mà hàm debug_print_backtrace() "biết" số dòng, nhưng debug_backtrace() [thỉnh thoảng] không, eh ??? ... đó là một bí ẩn ...
Nguồn
2013-03-04 20:29:06
Thú vị. Bạn có thể đăng một ví dụ? – deceze
Có lẽ nó nằm trong một ngoại lệ, đóng, đánh giá mã, hàm đánh dấu, trình xử lý lỗi, (về cơ bản là bất kỳ mã nào hoạt động ngoài ngăn xếp thực thi bình thường)? Khác hơn thế, tôi không thể hiểu tại sao bạn sẽ không nhận được số dòng (không có ít nhất một ví dụ) ... – ircmaxell
@deceze - Mã quá phức tạp để đăng một ví dụ. Tôi ước gì có thể nhưng có thể mất hàng giờ hoặc lâu hơn để xác định một thứ gì đó đủ đơn giản để đăng và nó không phải là vấn đề lớn đối với tôi để dành tất cả thời gian đó. – MikeSchinkel