Debugger PHP Stepthrough Interaktif diimplementasikan sebagai modul SAPI yang dapat memberi Anda kendali penuh atas lingkungan tanpa memengaruhi fungsionalitas atau kinerja kode Anda. Ini bertujuan untuk menjadi platform debugging yang ringan, kuat, mudah digunakan untuk PHP 5.4+ dan dikirim keluar dari kotak dengan PHP 5.6.
Fitur termasuk:
- Debugging Stepthrough
- Breakpoint Fleksibel (Metode Kelas, Fungsi, File: Baris, Alamat, Opcode)
- Akses mudah ke PHP dengan eval bawaan ()
- Akses Mudah ke Kode Pelaksana Saat Ini
- API Userland
- SAPI Agnostic - Mudah Diintegrasikan
- Dukungan File Konfigurasi PHP
- JIT Super Globals - Set Your Own !!
- Dukungan readline opsional - Pengoperasian Terminal yang Nyaman
- Dukungan Remote Debugging - GUI Java yang Dibundel
- Pengoperasian yang mudah
Lihat tangkapan layar:
Halaman depan: http://phpdbg.com/
Kesalahan PHP - Pelaporan kesalahan yang lebih baik untuk PHP
Ini sangat mudah digunakan perpustakaan (sebenarnya file) untuk men-debug skrip PHP Anda.
Satu-satunya hal yang perlu Anda lakukan adalah memasukkan satu file seperti di bawah ini (di awal kode Anda):
require('php_error.php');
\php_error\reportErrors();
Maka semua kesalahan akan memberi Anda info seperti backtrace, konteks kode, argumen fungsi, variabel server, dll. Misalnya:
Fitur termasuk:
- sepele untuk digunakan, itu hanya satu file
- kesalahan ditampilkan di browser untuk permintaan normal dan ajaxy
- Permintaan AJAX dijeda, memungkinkan Anda untuk menjalankannya kembali secara otomatis
- membuat kesalahan seketat mungkin (mendorong kualitas kode, dan cenderung meningkatkan kinerja)
- cuplikan kode di seluruh jejak tumpukan
- memberikan informasi lebih lanjut (seperti tanda tangan fungsi penuh)
- memperbaiki beberapa pesan kesalahan yang salah
- penyorotan sintaksis
- terlihat cantik!
- kustomisasi
- nyalakan dan matikan secara manual
- jalankan bagian tertentu tanpa pelaporan kesalahan
- abaikan file yang memungkinkan Anda untuk menghindari menyoroti kode dalam jejak tumpukan Anda
- file aplikasi; ini diprioritaskan saat kesalahan terjadi!
Halaman depan: http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
Garpu saya (dengan perbaikan tambahan): https://github.com/kenorb-contrib/PHP-Error
Jika sistem Anda mendukung pelacakan dinamis DTrace (diinstal secara default pada OS X) dan PHP Anda dikompilasi dengan probe DTrace diaktifkan ( --enable-dtrace
) yang seharusnya secara default, perintah ini dapat membantu Anda men-debug skrip PHP tanpa waktu:
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); }'
Jadi, alias berikut telah ditambahkan ke file rc Anda (mis. ~/.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); }"'
Anda mungkin melacak naskah Anda dengan mudah diingat alias: trace-php
.
Berikut ini skrip dtrace yang lebih canggih, cukup simpan ke dalamnya dtruss-php.d
, buatlah itu dapat dieksekusi ( chmod +x dtruss-php.d
) dan jalankan:
#!/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));
}
Home page: lampu dtruss di GitHub
Ini adalah penggunaan sederhana:
- Jalankan:
sudo dtruss-php.d
.
- Di jalankan terminal lain:
php -r "phpinfo();"
.
Untuk mengujinya, Anda dapat pergi ke sembarang dokumen dengan index.php
dan menjalankan server PHP builtin dengan:
php -S localhost:8080
Setelah itu Anda dapat mengakses situs di http: // localhost: 8080 / (atau memilih port apa pun yang nyaman bagi Anda). Dari sana akses beberapa halaman untuk melihat jejak jejak.
Catatan: Dtrace tersedia pada OS X secara default, di Linux Anda mungkin perlu dtrace4linux atau periksa beberapa alternatif lain .
Lihat: Menggunakan PHP dan DTrace di php.net
Atau periksa pelacakan SystemTap dengan menginstal paket pengembangan SystemTap SDT (misalnya yum install systemtap-sdt-devel
).
Berikut ini adalah contoh skrip ( all_probes.stp
) untuk melacak semua poin inti statis probe PHP selama durasi skrip PHP yang berjalan dengan 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));
}
Pemakaian:
stap -c 'sapi/cli/php test.php' all_probes.stp
Lihat: Menggunakan SystemTap dengan Probe Statis PHP DTrace di php.net