Làm thế nào để bạn gỡ lỗi các kịch bản PHP? [đóng cửa]


403

Làm thế nào để bạn gỡ lỗi các kịch bản PHP ?

Tôi biết về việc gỡ lỗi cơ bản như sử dụng Báo cáo Lỗi. Việc gỡ lỗi điểm dừng trong PHPEclipse cũng khá hữu ích.

Cách tốt nhất (về mặt nhanh chóng và dễ dàng) để gỡ lỗi trong phpStorm hoặc bất kỳ IDE nào khác là gì?




40
Tôi tin rằng đây là một câu hỏi tuyệt vời! Khi bạn không biết cách tiếp cận gỡ lỗi PHP, bạn thậm chí không biết cách đặt câu hỏi của mình, không biết cách chính xác hơn điều này. Vì vậy, nó có thể không tuân theo quy tắc của Stack, nhưng nó chắc chắn giúp chúng ta, những người mới bắt đầu, rất nhiều!
Mihaela

1
từ php5.4 trở đi đã giới thiệu trình gỡ lỗi giao diện dòng lệnh mới có tên là phpdbg ( phpdbg.com ). PHP5.6 sẽ đi kèm với phpdbg mặc định.
Ganesh Patil

1
Bạn đã từng nghe về XDebug chưa? :)
Pratik

Câu trả lời:


145

Hãy thử PDT của Eclipse để thiết lập một môi trường Eclipse có các tính năng gỡ lỗi như bạn đã đề cập. Khả năng bước vào mã là một cách tốt hơn để gỡ lỗi sau đó phương thức var_dump cũ và in tại các điểm khác nhau để xem luồng của bạn sai ở đâu. Khi tất cả những thứ khác không thành công và tất cả những gì tôi có là SSH và vim tôi vẫn var_dump()/ die()để tìm nơi mã đi về phía nam.


35
Bạn nên sử dụng chức năng này: kill ($ data) {die (var_dump ($ data)); } Nó tiết kiệm gõ 10 ký tự, chức năng tốt nhất tôi từng viết tbh :)
AlexMorley-Finch


2
Có cách nào để làm đẹp "var_dump" không?
RPDeshaies

6
@ AlexMorley-Finch Tôi nâng bạn lênkill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; }
Francisco Presencia

2
Liên kết là "có thể phục hồi" thông qua Lưu trữ web đáng kinh ngạc , kiểm tra lần cuối kể từ ngày 7 tháng 5.
Gruber

80

Bạn có thể sử dụng Firephp một add-on để fireorms để gỡ lỗi php trong cùng môi trường với javascript.

Tôi cũng sử dụng Xdebug đã đề cập trước đó để định hình php.


3
Và đây là hướng dẫn nhanh để sử dụng FirePHP: sitepoint.com/debug-php-fireorms-firephp
Mihaela

38

Đây là môi trường gỡ lỗi nhỏ của tôi:

error_reporting(-1);
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'assert_callcack');
set_error_handler('error_handler');
set_exception_handler('exception_handler');
register_shutdown_function('shutdown_handler');

function assert_callcack($file, $line, $message) {
    throw new Customizable_Exception($message, null, $file, $line);
}

function error_handler($errno, $error, $file, $line, $vars) {
    if ($errno === 0 || ($errno & error_reporting()) === 0) {
        return;
    }

    throw new Customizable_Exception($error, $errno, $file, $line);
}

function exception_handler(Exception $e) {
    // Do what ever!
    echo '<pre>', print_r($e, true), '</pre>';
    exit;
}

function shutdown_handler() {
    try {
        if (null !== $error = error_get_last()) {
            throw new Customizable_Exception($error['message'], $error['type'], $error['file'], $error['line']);
        }
    } catch (Exception $e) {
        exception_handler($e);
    }
}

class Customizable_Exception extends Exception {
    public function __construct($message = null, $code = null, $file = null, $line = null) {
        if ($code === null) {
            parent::__construct($message);
        } else {
            parent::__construct($message, $code);
        }
        if ($file !== null) {
            $this->file = $file;
        }
        if ($line !== null) {
            $this->line = $line;
        }
    }
}

2
Cảm ơn bạn. Điều đó đã cứu ngày của tôi. (Tôi vừa phải xóa E_STRICT đó)
Sec

4
assert_callcackheh
Madbreaks

32

Xdebug và plugin DBGp cho Notepad ++ để tìm lỗi nặng, FirePHP cho các công cụ nhẹ. Nhanh chóng và hèn hạ? Không có gì vượt qua dBug .


Plugin DBGp không hoạt động với phiên bản notepad ++ / xdebug hiện tại và không có kế hoạch khắc phục. Bạn có thể thấy cuộc thảo luận của tôi với người tạo được liên kết tại đây
Joe

26

XDebug rất cần thiết cho sự phát triển. Tôi cài đặt nó trước bất kỳ phần mở rộng khác. Nó cung cấp cho bạn dấu vết ngăn xếp trên bất kỳ lỗi nào và bạn có thể kích hoạt hồ sơ dễ dàng.

Để xem nhanh việc sử dụng cấu trúc dữ liệu var_dump(). Đừng sử dụng print_r()vì bạn sẽ phải bao quanh nó <pre>và nó chỉ in một var mỗi lần.

<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>

Đối với một môi trường gỡ lỗi thực sự, thứ tốt nhất tôi tìm thấy là Komodo IDE nhưng nó có giá $$.


19

PhpEd thực sự tốt. Bạn có thể bước vào / trên / ngoài chức năng. Bạn có thể chạy mã ad-hoc, kiểm tra các biến, thay đổi biến. Thật là kinh ngạc.


4
Tôi đã sử dụng PhpEd và tôi không có từ nào để nói về nó khi so sánh với một IDE thực sự như NetBeans hoặc Eclipse, cũng như nhận xét này không thêm bất cứ điều gì hữu ích cho câu hỏi. -1
siliconrockstar

Tôi đã thử hầu hết các IDE (bao gồm Zend, NetBeans và Eclipse) trước khi mua PhpED Professional vì nó tốt nhất khoảng một dặm rưỡi. Đây là một vài năm trước, vì vậy những người khác có thể đã được cải thiện, nhưng tại thời điểm đó hầu hết đều chậm chạp vì chúng được viết bằng Java. Tôi không hiểu làm thế nào một người nào đó có thể "không có từ ngữ nào cho nó" khi (đối với tôi) nó rõ ràng là tốt nhất, quyết định là không có trí tuệ.
lm713

17

1) Tôi sử dụng print_r (). Trong TextMate, tôi có một đoạn cho 'pre' mở rộng ra điều này:

echo "<pre>";
print_r();
echo "</pre>";

2) Tôi sử dụng Xdebug, nhưng không thể để GUI hoạt động ngay trên máy Mac của tôi. Nó ít nhất in ra một phiên bản có thể đọc được của dấu vết ngăn xếp.


Tôi chắc chắn bạn có nghĩa là tiếng vang "</ pre>"; vào cuối mặc dù.
altermativ

9
Bạn cũng có thể truyền 'true' vào hàm để nó trả về chuỗi. Điều đó có nghĩa là bạn có thể làm điều này:echo '<pre>', print_r($var, true), '</pre>';
DisgruntledGoat


16

Thành thật mà nói, sự kết hợp giữa print và print_r () để in ra các biến. Tôi biết rằng nhiều người thích sử dụng các phương pháp nâng cao khác nhưng tôi thấy cách này dễ sử dụng nhất.

Tôi sẽ nói rằng tôi không hoàn toàn đánh giá cao điều này cho đến khi tôi thực hiện một số chương trình Vi xử lý tại Uni và không thể sử dụng ngay cả điều này.


Tôi rất vui vì bạn đã đề cập đến in cũng như print_r, tôi sử dụng một bản in cơ bản để xem mã có được thực thi đến một điểm nhất định hay không, giúp cô lập vấn đề.
Brad

Tôi sử dụng cả print và var_dump (). Tôi sử dụng in để hiển thị thông báo gỡ lỗi và thông tin và var_dump để chỉ trạng thái của các biến khi mọi thứ tiến triển.
Joshua K

14

Xdebug , bởi Derick Rethans, rất tốt. Tôi đã sử dụng nó một thời gian trước và thấy nó không dễ cài đặt. Khi bạn đã hoàn tất, bạn sẽ không hiểu cách bạn quản lý mà không có nó :-)

Có một bài viết hay về Zend Developer Zone (cài đặt trên Linux dường như không dễ dàng hơn) và thậm chí là một plugin Firefox , thứ mà tôi chưa bao giờ sử dụng.


2
Nó không chỉ cài đặt mà bực bội. Việc cấu hình Xdebug để hoạt động với Eclipse có thể là một cơn ác mộng. Tôi đã có thể cài đặt Xdebug trên CentOS 5 nhưng EclipsePDT + Xdebug không muốn hợp tác :(
Jahangir


11

Tôi sử dụng Netbeans với XDebug và Tiện ích bổ sung FireFox dễ dàng XDebug

Bổ trợ là điều cần thiết khi bạn gỡ lỗi các dự án MVC, bởi vì cách thông thường XDebug chạy trong Netbeans là đăng ký phiên dbug thông qua url. Với tiện ích bổ sung được cài đặt trong FireFox, bạn sẽ đặt các thuộc tính dự án Netbeans của mình -> Chạy Cấu hình -> Nâng cao và chọn "Không mở trình duyệt web" Bây giờ bạn có thể đặt điểm dừng của mình và bắt đầu phiên gỡ lỗi bằng Ctrl-F5 như bình thường . Mở FireFox và nhấp chuột phải vào biểu tượng Bổ trợ ở góc dưới bên phải để bắt đầu theo dõi các điểm dừng. Khi mã đạt đến điểm dừng, nó sẽ dừng và bạn có thể kiểm tra trạng thái biến và ngăn xếp cuộc gọi của mình.



9

PhpEdit có trình gỡ lỗi tích hợp, nhưng tôi thường kết thúc bằng echo (); và print_r (); cách thức cũ !!


8

Đối với các vấn đề thực sự nghiêm trọng sẽ tốn quá nhiều thời gian để sử dụng print_r / echo để tìm ra tôi sử dụng tính năng gỡ lỗi (PhpEd) của IDE. Không giống như các IDE khác mà tôi đã sử dụng, PhpEd yêu cầu khá nhiều thiết lập. lý do duy nhất tôi không sử dụng nó cho bất kỳ vấn đề nào tôi gặp phải là nó rất chậm. Tôi không chắc chắn rằng sự chậm chạp là dành riêng cho PhpEd hoặc bất kỳ trình gỡ lỗi php nào. PhpEd không miễn phí nhưng tôi tin rằng nó sử dụng một trong những trình gỡ lỗi nguồn mở (như XDebug đã đề cập trước đây). Lợi ích với PhpEd, một lần nữa, là nó không yêu cầu thiết lập mà tôi thấy thực sự khá tẻ nhạt trong quá khứ.


2
Trình gỡ lỗi PHPEd thực sự được viết bởi cùng một người đã viết PHPEd và tôi khá chắc chắn rằng nó không phải là nguồn mở. Ít nhất PHPEd không giao hàng với nguồn mà thay vào đó được biên dịch .so và.
Artem Russakovskii

4

Việc gỡ lỗi thủ công thường nhanh hơn đối với tôi - var_dump()debug_print_backtrace()là tất cả các công cụ bạn cần để hỗ trợ logic của bạn.


3

Vâng, ở một mức độ nào đó, nó phụ thuộc vào nơi mọi thứ đang đi về phía nam. Đó là điều đầu tiên tôi cố gắng cô lập, và sau đó tôi sẽ sử dụng echo / print_r () khi cần thiết.

Lưu ý: Các bạn có biết rằng bạn có thể chuyển đúng thành đối số thứ hai cho print_r () và nó sẽ trả về đầu ra thay vì in không? Ví dụ:

echo "<pre>".print_r($var, true)."</pre>";

2
Tôi chỉ gói nó trong một chức năng gọi là gỡ lỗi. Vì vậy, sau đó tôi có thể làm gỡ lỗi ($ var);
jdelator

3

Tôi thường sử dụng CakePHP khi Rails không thể. Để gỡ lỗi, tôi thường tìm error.logtrong thư mục tmp và nối đuôi nó trong terminal bằng lệnh ...

tail -f app/tmp/logs/error.log

Nó cung cấp cho bạn hộp thoại đang chạy từ bánh của những gì đang diễn ra, khá tiện dụng, nếu bạn muốn xuất một cái gì đó sang mã giữa, bạn có thể sử dụng.

$this->log('xxxx');

Điều này thường có thể cung cấp cho bạn một ý tưởng tốt về những gì đang xảy ra / sai.



2

Komodo IDE hoạt động tốt với xdebug, ngay cả đối với việc gỡ lỗi còn lại. Nó cần số lượng cấu hình tối thiểu. Tất cả những gì bạn cần là một phiên bản php mà Komodo có thể sử dụng cục bộ để chuyển qua mã trên một điểm dừng. Nếu bạn có tập lệnh được nhập vào dự án komodo, thì bạn có thể đặt điểm dừng bằng một cú nhấp chuột chỉ bằng cách bạn đặt nó trong nhật thực để gỡ lỗi chương trình java. Gỡ lỗi từ xa rõ ràng là khó khăn hơn để làm cho nó hoạt động chính xác (bạn có thể phải ánh xạ url từ xa với tập lệnh php trong không gian làm việc của bạn) so với thiết lập gỡ lỗi cục bộ khá dễ dàng để định cấu hình nếu bạn đang ở trên máy tính để bàn MAC hoặc linux .



2

Có nhiều kỹ thuật gỡ lỗi PHP có thể giúp bạn tiết kiệm vô số giờ khi mã hóa. Một kỹ thuật sửa lỗi cơ bản nhưng hiệu quả là chỉ cần bật báo cáo lỗi. Một kỹ thuật nâng cao hơn một chút liên quan đến việc sử dụng các câu lệnh in, có thể giúp xác định các lỗi khó nắm bắt hơn bằng cách hiển thị những gì thực sự xuất hiện trên màn hình. PHPeclipse là một trình cắm thêm Eclipse có thể làm nổi bật các lỗi cú pháp phổ biến và có thể được sử dụng cùng với trình gỡ lỗi để đặt các điểm dừng.

display_errors = Off
error_reporting = E_ALL 
display_errors = On

và cũng được sử dụng

error_log();
console_log();

1

Trong môi trường sản xuất, tôi ghi nhật ký dữ liệu liên quan vào nhật ký lỗi của máy chủ với error_log ().


và hơn đuôi -f ... hoạt động rất tốt
markus_p

1

tôi sử dụng zend studio để nhật thực với trình gỡ lỗi tích hợp. Nó vẫn chậm so với gỡ lỗi với nhật thực pdt với xdebug. Hy vọng họ sẽ khắc phục những vấn đề đó, tốc độ đã được cải thiện so với các bản phát hành gần đây nhưng vẫn bước qua mọi thứ mất 2-3 giây. Thanh công cụ firefox zend thực sự làm cho mọi thứ dễ dàng (gỡ lỗi trang tiếp theo, trang hiện tại, v.v.). Ngoài ra, nó cung cấp một trình lược tả sẽ điểm chuẩn mã của bạn và cung cấp biểu đồ hình tròn, thời gian thực hiện, v.v.


1

Hầu hết các lỗi có thể được tìm thấy dễ dàng bằng cách chỉ cần nhập var_dumpmột số biến chính, nhưng rõ ràng nó phụ thuộc vào loại ứng dụng bạn phát triển.

Đối với một thuật toán phức tạp hơn, các chức năng bước / điểm dừng / đồng hồ rất hữu ích (nếu không cần thiết)


1

DBG PHP

Trình gỡ lỗi PHP bước tương tác được triển khai như một mô-đun SAPI có thể cung cấp cho bạn quyền kiểm soát hoàn toàn đối với môi trường mà không ảnh hưởng đến chức năng hoặc hiệu suất của mã của bạn. Nó nhằm mục đích trở thành một nền tảng gỡ lỗi nhẹ, mạnh mẽ, dễ sử dụng cho PHP 5.4+ và nó được vận chuyển ngoài luồng với PHP 5.6.

Các tính năng bao gồm:

  • Gỡ lỗi từng bước
  • Điểm dừng linh hoạt (Phương thức lớp, Chức năng, Tệp: Dòng, Địa chỉ, Opcode)
  • Dễ dàng truy cập PHP với eval () tích hợp
  • Dễ dàng truy cập vào mã hiện hành
  • API người dùng
  • Bất khả tri SAPI - Tích hợp dễ dàng
  • Hỗ trợ tệp cấu hình PHP
  • JIT Super Globals - Thiết lập của riêng bạn !!
  • Hỗ trợ đọc đường dẫn tùy chọn - Vận hành thiết bị đầu cuối thoải mái
  • Hỗ trợ gỡ lỗi từ xa - GUI Java kèm theo
  • Hoạt động dễ dàng

Xem ảnh chụp màn hình:

PHP DBG - Gỡ lỗi từng bước - ảnh chụp màn hình

PHP DBG - Gỡ lỗi từng bước - ảnh chụp màn hình

Trang chủ: http://phpdbg.com/

Lỗi PHP - Báo cáo lỗi tốt hơn cho PHP

Điều này rất dễ sử dụng thư viện (thực sự là một tệp) để gỡ lỗi các tập lệnh PHP của bạn.

Điều duy nhất bạn cần làm là bao gồm một tệp như dưới đây (ở đầu mã của bạn):

require('php_error.php');
\php_error\reportErrors();

Sau đó, tất cả các lỗi sẽ cung cấp cho bạn thông tin như backtrace, bối cảnh mã, đối số hàm, biến máy chủ, v.v. Ví dụ:

Lỗi PHP |  Cải thiện báo cáo lỗi cho PHP - ảnh chụp màn hình của backtrace Lỗi PHP |  Cải thiện báo cáo lỗi cho PHP - ảnh chụp màn hình của backtrace Lỗi PHP |  Cải thiện báo cáo lỗi cho PHP - ảnh chụp màn hình của backtrace

Các tính năng bao gồm:

  • tầm thường để sử dụng, nó chỉ là một tập tin
  • lỗi hiển thị trong trình duyệt cho các yêu cầu thông thường và aj Wax
  • Yêu cầu AJAX bị tạm dừng, cho phép bạn tự động chạy lại chúng
  • mắc lỗi nghiêm trọng nhất có thể (khuyến khích chất lượng mã và có xu hướng cải thiện hiệu suất)
  • đoạn mã trên toàn bộ dấu vết ngăn xếp
  • cung cấp thêm thông tin (như chữ ký đầy đủ chức năng)
  • sửa một số thông báo lỗi hoàn toàn sai
  • đánh dấu cú pháp
  • trông xinh quá
  • tùy biến
  • tự bật và tắt
  • chạy các phần cụ thể mà không báo cáo lỗi
  • bỏ qua các tệp cho phép bạn tránh làm nổi bật mã trong theo dõi ngăn xếp của bạn
  • hồ sơ ứng dụng; những điều này được ưu tiên khi xảy ra lỗi!

Trang chủ: http://phperror.net/

GitHub: https://github.com/JosephLenton/PHP-Error

Cái nĩa của tôi (có thêm bản sửa lỗi): https://github.com/kenorb-contrib/PHP-Error

DTrace

Nếu hệ thống của bạn hỗ trợ theo dõi động DTrace (được cài đặt theo mặc định trên OS X) và PHP của bạn được biên dịch với các đầu dò DTrace được bật ( --enable-dtrace) theo mặc định, lệnh này có thể giúp bạn gỡ lỗi tập lệnh PHP mà không mất thời gian:

sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'

Vì vậy, cho bí danh sau đây đã được thêm vào của bạn rc file (ví dụ ~/.bashrc, ~/.bash_aliases):

alias trace-php='sudo dtrace -qn "php*:::function-entry { printf(\"%Y: PHP function-entry:\t%s%s%s() in %s:%d\n\", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }"'

bạn có thể theo dõi tập lệnh của mình với bí danh dễ nhớ : trace-php.

Đây là kịch bản dtrace nâng cao hơn, chỉ cần lưu nó vào dtruss-php.d, làm cho nó có thể thực thi được ( chmod +x dtruss-php.d) và chạy:

#!/usr/sbin/dtrace -Zs
# See: https://github.com/kenorb/dtruss-lamp/blob/master/dtruss-php.d

#pragma D option quiet

php*:::compile-file-entry
{
    printf("%Y: PHP compile-file-entry:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1));
}

php*:::compile-file-return
{
    printf("%Y: PHP compile-file-return:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), basename(copyinstr(arg1)));
}

php*:::error
{
    printf("%Y: PHP error message:\t%s in %s:%d\n", walltimestamp, copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::exception-caught
{
    printf("%Y: PHP exception-caught:\t%s\n", walltimestamp, copyinstr(arg0));
}

php*:::exception-thrown
{
    printf("%Y: PHP exception-thrown:\t%s\n", walltimestamp, copyinstr(arg0));
}

php*:::execute-entry
{
    printf("%Y: PHP execute-entry:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}

php*:::execute-return
{
    printf("%Y: PHP execute-return:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}

php*:::function-entry
{
    printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::function-return
{
    printf("%Y: PHP function-return:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::request-shutdown
{
    printf("%Y: PHP request-shutdown:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}

php*:::request-startup
{
    printf("%Y, PHP request-startup:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}

Trang chủ: đèn dtruss tại GitHub

Đây là cách sử dụng đơn giản:

  1. Chạy : sudo dtruss-php.d.
  2. Trên một thiết bị đầu cuối khác chạy : php -r "phpinfo();".

Để kiểm tra điều đó, bạn có thể truy cập bất kỳ docroot nào index.phpvà chạy máy chủ dựng sẵn PHP bằng cách:

php -S localhost:8080

Sau đó, bạn có thể truy cập trang web tại http: // localhost: 8080 / (hoặc chọn bất kỳ cổng nào thuận tiện cho bạn). Từ đó truy cập một số trang để xem đầu ra theo dõi.

Lưu ý: Dtrace có sẵn trên OS X theo mặc định, trên Linux bạn có thể cần dtrace4linux hoặc kiểm tra một số lựa chọn thay thế khác .

Xem: Sử dụng PHP và DTrace tại php.net


SystemTap

Hoặc kiểm tra theo dõi SystemTap bằng cách cài đặt gói phát triển SystemTap SDT (ví dụ yum install systemtap-sdt-devel).

Dưới đây là tập lệnh ví dụ ( all_probes.stp) để theo dõi tất cả các điểm thăm dò tĩnh PHP cốt lõi trong suốt thời gian của tập lệnh PHP đang chạy với SystemTap:

probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
    printf("Probe compile__file__entry\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
    printf("Probe compile__file__return\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
    printf("Probe error\n");
    printf("  errormsg %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
    printf("Probe exception__caught\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
    printf("Probe exception__thrown\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
    printf("Probe execute__entry\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
    printf("Probe execute__return\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
    printf("Probe function__entry\n");
    printf("  function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
    printf("Probe function__return: %s\n", user_string($arg1));
    printf(" function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
    printf("Probe request__shutdown\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
    printf("Probe request__startup\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}

Sử dụng:

stap -c 'sapi/cli/php test.php' all_probes.stp

Xem: Sử dụng SystemTap với PHP DTrace Tĩnh Probes tại php.net


0

+1 cho print_r (). Sử dụng nó để loại bỏ nội dung của một đối tượng hoặc biến. Để làm cho nó dễ đọc hơn, hãy thực hiện với thẻ trước để bạn không cần xem nguồn.

echo '<pre>';
print_r($arrayOrObject);

Ngoài ra var_dump ($ thing) - điều này rất hữu ích để xem loại subthings


Một phiên bản mở rộng có thể được tìm thấy ở đây devarticles.in/php/usiously-feft-to-output-debug-data-in-php
Arvind K.


0

Tùy thuộc vào vấn đề tôi thích một sự kết hợp của error_Vporting (E_ALL) trộn lẫn với các bài kiểm tra tiếng vang (để tìm dòng / tập tin vi phạm, lỗi ban đầu xảy ra; bạn BIẾT không phải lúc nào dòng / tập tin php cũng nói với bạn đúng không?) (để giải quyết "Lỗi phân tích cú pháp: lỗi cú pháp, sự cố $ end" không mong muốn) và print_r (); lối ra; bãi (lập trình viên thực sự xem nguồn; p).

Bạn cũng không thể đánh bại phpdebug (kiểm tra sourceforge) bằng "memory_get_usage ();" và "memory_get_peak_usage ();" để tìm các khu vực có vấn đề.


0

Các trình gỡ lỗi tích hợp nơi bạn có thể xem các giá trị thay đổi khi bạn thực hiện mã thông qua. Tuy nhiên, họ yêu cầu thiết lập phần mềm trên máy chủ và một lượng cấu hình nhất định trên máy khách. Cả hai đều yêu cầu bảo trì định kỳ để giữ cho hoạt động tốt.

Một print_r dễ viết và được đảm bảo hoạt động trong mọi thiết lập.


0

Thông thường tôi thấy tạo một chức năng nhật ký tùy chỉnh có thể lưu trên tệp, lưu trữ thông tin gỡ lỗi và cuối cùng in lại trên một chân trang chung.

Bạn cũng có thể ghi đè lớp Exception phổ biến, để loại gỡ lỗi này là bán tự động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.