Bagaimana Anda men-debug skrip PHP? [Tutup]

403

Bagaimana Anda men-debug skrip PHP ?

Saya mengetahui tentang debugging dasar seperti menggunakan Pelaporan Kesalahan. Breakpoint debugging di PHPEclipse juga cukup berguna.

Apa cara terbaik (dalam hal cepat dan mudah) untuk men-debug di phpStorm atau IDE lainnya?

Andrey Adamovich
sumber
40
Saya yakin ini pertanyaan yang bagus! Ketika Anda tidak tahu bagaimana cara mendekati debugging PHP, Anda bahkan tidak tahu bagaimana mengatakan pertanyaan Anda, tidak tahu bagaimana untuk lebih tepat dari ini. Jadi, itu mungkin tidak mematuhi aturan Stack, tapi itu pasti banyak membantu kita, pemula, banyak!
Mihaela
1
dari php5.4 dan seterusnya memperkenalkan debugger antarmuka baris perintah baru yang disebut phpdbg ( phpdbg.com ). PHP5.6 akan datang dengan phpdbg default.
Ganesh Patil
1
Pernah mendengar tentang XDebug? :)
Pratik

Jawaban:

145

Coba Eclipse PDT untuk menyiapkan lingkungan Eclipse yang memiliki fitur debug seperti yang Anda sebutkan. Kemampuan untuk masuk ke kode adalah cara yang jauh lebih baik untuk men-debug kemudian metode lama var_dump dan mencetak di berbagai titik untuk melihat di mana aliran Anda salah. Ketika semuanya gagal dan semua yang saya miliki adalah SSH dan vim saya masih var_dump()/ die()untuk menemukan di mana kode pergi ke selatan.

John Downey
sumber
35
Anda harus menggunakan fungsi ini: kill ($ data) {die (var_dump ($ data)); } Ini menghemat mengetik 10 karakter, fungsi terbaik yang pernah saya tulis tbh :)
AlexMorley-Finch
2
Coba github.com/tomasfejfar/enhanced-dump :)
Tomáš Fejfar
2
Apakah ada cara untuk mempercantik "var_dump"?
RPDeshaies
6
@ AlexMorley-Finch Saya membesarkan Anda untukkill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; }
Francisco Presencia
2
Tautan "dapat dipulihkan" melalui Web Archive yang luar biasa , cek terakhir pada 7 Mei '15.
Gruber
80

Anda dapat menggunakan Firephp sebagai add-on untuk firebug untuk men-debug php di lingkungan yang sama dengan javascript.

Saya juga menggunakan Xdebug yang disebutkan sebelumnya untuk membuat profil php.

Pat
sumber
3
Dan inilah panduan cepat untuk menggunakan FirePHP: sitepoint.com/debug-php-firebug-firephp
Mihaela
38

Ini adalah lingkungan debug kecil saya:

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;
        }
    }
}
Eisberg
sumber
2
Terima kasih. Itu menyelamatkan hari saya. (Saya baru saja menghapus E_STRICT itu)
Sec
4
assert_callcackheh
Madbreaks
32

Xdebug dan plugin DBGp untuk Notepad ++ untuk tugas berat berburu bug, FirePHP untuk hal-hal ringan. Cepat dan kotor? Tidak ada yang mengalahkan dBug .

djn
sumber
Plugin DBGp tidak berfungsi dengan versi notepad ++ / xdebug saat ini dan tidak ada rencana untuk memperbaikinya. Anda dapat melihat diskusi saya dengan pencipta yang tertaut di sini
Joe
26

XDebug sangat penting untuk pengembangan. Saya menginstalnya sebelum ekstensi lainnya. Ini memberi Anda tumpukan jejak pada kesalahan apa pun dan Anda dapat mengaktifkan profil dengan mudah.

Untuk melihat sekilas penggunaan struktur data var_dump(). Jangan gunakan print_r()karena Anda harus mengelilinginya <pre>dan hanya mencetak satu var sekaligus.

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

Untuk lingkungan debugging nyata yang terbaik yang saya temukan adalah Komodo IDE tetapi harganya $$.

Julio César
sumber
19

PhpEd sangat bagus. Anda dapat masuk / keluar / keluar dari fungsi. Anda dapat menjalankan kode ad-hoc, memeriksa variabel, mengubah variabel. Ini luar biasa.

monk.e.boy
sumber
4
Saya telah menggunakan PhpEd dan saya tidak memiliki kata-kata baik untuk itu ketika dibandingkan dengan IDE nyata seperti NetBeans atau Eclipse, juga komentar ini tidak menambahkan sesuatu yang berguna untuk pertanyaan itu. -1
siliconrockstar
Saya mencoba sebagian besar IDE (termasuk Zend, NetBeans, dan Eclipse) sebelum membeli PhpED Professional karena itu yang terbaik sejauh satu setengah mil. Ini beberapa tahun yang lalu, jadi yang lain mungkin sudah membaik, tetapi pada saat itu kebanyakan dari mereka sangat lambat karena ditulis di Jawa. Saya tidak mengerti bagaimana seseorang dapat memiliki "tidak ada kata-kata baik untuk itu" ketika (bagi saya) itu jelas yang terbaik, keputusannya adalah no-brainer.
lm713
17

1) Saya menggunakan print_r (). Di TextMate, saya memiliki cuplikan untuk 'pra' yang meluas ke ini:

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

2) Saya menggunakan Xdebug, tetapi belum bisa menjalankan GUI di Mac saya. Setidaknya mencetak versi jejak stack yang dapat dibaca.

jlleblanc
sumber
Saya yakin maksud Anda echo "</pre>"; pada akhirnya.
altermativ
9
Anda juga dapat melewatkan 'true' ke dalam fungsi sehingga mengembalikan string. Ini berarti Anda dapat melakukan ini:echo '<pre>', print_r($var, true), '</pre>';
DisgruntledGoat
16

Saya telah menggunakan Zend Studio (5.5) , bersama dengan Zend Platform . Itu memberi debugging yang tepat, breakpoints / melangkahi kode dll, meskipun dengan harga.

Michael Stum
sumber
16

Dalam semua kejujuran, kombinasi print dan print_r () untuk mencetak variabel. Saya tahu bahwa banyak yang lebih suka menggunakan metode lain yang lebih maju, tetapi saya menemukan ini yang paling mudah digunakan.

Saya akan mengatakan bahwa saya tidak sepenuhnya menghargai ini sampai saya melakukan beberapa pemrograman Microprocessor di Uni dan bahkan tidak dapat menggunakan ini.

Teifion
sumber
Saya senang Anda menyebutkan print serta print_r, saya menggunakan print dasar untuk melihat apakah kode dieksekusi ke titik tertentu, yang membantu mengisolasi masalah.
Brad
Saya menggunakan print dan var_dump (). Saya menggunakan cetak untuk menampilkan pesan dan informasi debug dan var_dump untuk menunjukkan keadaan variabel saat hal-hal berkembang.
Joshua K
14

Xdebug , karya Derick Rethans, sangat bagus. Saya menggunakannya beberapa waktu lalu dan ternyata tidak mudah menginstalnya. Setelah selesai, Anda tidak akan mengerti bagaimana Anda berhasil tanpanya :-)

Ada artikel bagus tentang Zend Developer Zone (menginstal di Linux sepertinya tidak lebih mudah) dan bahkan sebuah plugin Firefox , yang tidak pernah saya gunakan.

Christian Lescuyer
sumber
2
Bukan hanya menginstal yang membuat frustrasi. Mengkonfigurasi Xdebug agar berfungsi dengan Eclipse bisa menjadi mimpi buruk. Saya bisa menginstal Xdebug di CentOS 5 tetapi EclipsePDT + Xdebug tidak mau bekerja sama :(
Jahangir
11

Saya menggunakan Netbeans dengan XDebug. Lihatlah di situs webnya untuk mendapatkan dokumen tentang cara mengonfigurasinya. http://php.netbeans.org/

Nacho
sumber
11

Saya menggunakan Netbeans dengan XDebug dan Easy XDebug FireFox Add-on

Add-on sangat penting ketika Anda men-debug proyek MVC, karena cara XDebug berjalan normal di Netbeans adalah dengan mendaftarkan sesi dbug melalui url. Dengan add-on yang terinstal di FireFox, Anda akan mengatur properti proyek Netbeans Anda -> Run Configuratuion -> Advanced dan pilih "Do Not Open Web Browser" Anda sekarang dapat mengatur titik istirahat Anda dan memulai sesi debug dengan Ctrl-F5 seperti biasa . Buka FireFox dan klik kanan ikon Add-on di sudut kanan bawah untuk mulai memantau breakpoints. Ketika kode mencapai breakpoint itu akan berhenti dan Anda dapat memeriksa status variabel Anda dan tumpukan panggilan.

Jannie Theunissen
sumber
10

Output buffering sangat berguna jika Anda tidak ingin mengacaukan output Anda. Saya melakukan ini dalam satu baris yang dapat saya komentari / batalkan komentar sesuka hati

 ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();
Ken
sumber
9

PhpEdit memiliki debugger bawaan, tetapi saya biasanya menggunakan echo (); dan print_r (); cara kuno !!

Toby Allen
sumber
8

Untuk masalah yang benar-benar berat yang akan memakan waktu terlalu lama untuk menggunakan print_r / echo untuk mencari tahu saya menggunakan fitur debugging (PhpEd) IDE saya. Tidak seperti IDE lain yang saya gunakan, PhpEd tidak memerlukan setup. satu-satunya alasan saya tidak menggunakannya untuk masalah yang saya temui adalah sangat lambat. Saya tidak yakin bahwa kelambatan khusus untuk PhpEd atau debugger php apa pun. PhpEd tidak gratis tetapi saya percaya itu menggunakan salah satu dari debugger open-source (seperti XDebug yang disebutkan sebelumnya). Keuntungan dengan PhpEd, sekali lagi, adalah tidak memerlukan pengaturan yang saya temukan sangat membosankan di masa lalu.

Karim
sumber
2
Debugger PHPEd sebenarnya ditulis oleh orang yang sama yang menulis PHPEd dan saya cukup yakin itu bukan open source. Setidaknya PHPEd tidak menyertakan sumber tetapi mengkompilasi .so dan .dll.
Artem Russakovskii
4

Debugging manual umumnya lebih cepat bagi saya - var_dump()dan debug_print_backtrace()semua alat yang Anda butuhkan untuk melengkapi logika Anda.

Ross
sumber
3

Ya, sampai taraf tertentu itu tergantung pada ke mana arah selatan. Itu hal pertama yang saya coba untuk mengisolasi, dan kemudian saya akan menggunakan echo / print_r () sebagaimana diperlukan.

NB: Kalian tahu bahwa Anda dapat meneruskan true sebagai argumen kedua ke print_r () dan itu akan mengembalikan hasilnya alih-alih mencetaknya? Misalnya:

echo "<pre>".print_r($var, true)."</pre>";
Nathan Strong
sumber
2
Saya hanya membungkusnya dalam fungsi yang disebut debug. Jadi saya bisa melakukan debug ($ var);
jdelator
3

Saya sering menggunakan CakePHP ketika Rails tidak memungkinkan. Untuk men-debug kesalahan saya biasanya menemukan error.logdi folder tmp dan mengekornya di terminal dengan perintah ...

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

Ini memberi Anda menjalankan dialog dari apa yang sedang terjadi, yang sangat berguna, jika Anda ingin menampilkan sesuatu untuk itu kode tengah yang dapat Anda gunakan.

$this->log('xxxx');

Ini biasanya dapat memberi Anda ide yang baik tentang apa yang sedang terjadi / salah.

Bagian Mint
sumber
2

IDE Komodo bekerja dengan baik dengan xdebug, bahkan untuk debugging remore. Perlu jumlah minimum konfigurasi. Yang Anda butuhkan hanyalah versi php yang bisa digunakan Komodo secara lokal untuk menelusuri kode pada breakpoint. Jika Anda memiliki skrip yang diimpor ke proyek komodo, maka Anda dapat mengatur breakpoints dengan klik mouse persis bagaimana Anda akan mengaturnya di dalam gerhana untuk debugging program java. Remote debugging jelas lebih sulit untuk membuatnya berfungsi dengan benar (Anda mungkin harus memetakan url jarak jauh dengan skrip php di ruang kerja Anda) daripada pengaturan debugging lokal yang cukup mudah untuk dikonfigurasikan jika Anda berada di MAC atau desktop linux .

ya
sumber
2

Nusphere juga merupakan debugger yang bagus untuk php nusphere

Mufaddal
sumber
2

Ada banyak teknik debugging PHP yang dapat menghemat banyak waktu Anda saat coding. Teknik debugging yang efektif tetapi mendasar adalah dengan hanya mengaktifkan pelaporan kesalahan. Teknik lain yang sedikit lebih maju melibatkan penggunaan pernyataan cetak, yang dapat membantu menunjukkan bug yang lebih sulit dipahami dengan menampilkan apa yang sebenarnya terjadi di layar. PHPeclipse adalah plug-in Eclipse yang dapat menyoroti kesalahan sintaksis umum dan dapat digunakan bersama dengan debugger untuk mengatur breakpoints.

display_errors = Off
error_reporting = E_ALL 
display_errors = On

dan juga digunakan

error_log();
console_log();
shekh danishuesn
sumber
1

Dalam lingkungan produksi, saya mencatat data yang relevan ke log kesalahan server dengan error_log ().

Dan Grover
sumber
dan daripada tail -f ... berfungsi dengan baik
markus_p
1

saya menggunakan zend studio untuk gerhana dengan debugger bawaan. Masih lambat dibandingkan dengan debugging dengan eclipse pdt dengan xdebug. Semoga mereka akan memperbaiki masalah-masalah itu, kecepatan telah meningkat selama rilis baru-baru ini tetapi masih melangkah lebih dari 2-3 detik. Toolbar zend firefox benar-benar memudahkan segalanya (debug halaman berikutnya, halaman saat ini, dll). Juga menyediakan profiler yang akan membandingkan kode Anda dan memberikan diagram lingkaran, waktu eksekusi, dll.

Brendon-Van-Heyzen
sumber
1

Sebagian besar bug dapat ditemukan dengan mudah hanya var_dumpdengan memasukkan beberapa variabel kunci, tetapi jelas tergantung pada jenis aplikasi yang Anda kembangkan.

Untuk algoritma yang lebih kompleks, fungsi step / breakpoint / watch sangat membantu (jika tidak perlu)

Petr Peller
sumber
1

PHP DBG

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:

PHP DBG - Stepthrough Debugging - tangkapan layar

PHP DBG - Stepthrough Debugging - 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:

Kesalahan PHP |  Perbaiki Error Reporting for PHP - tangkapan layar backtrace Kesalahan PHP |  Perbaiki Error Reporting for PHP - tangkapan layar backtrace Kesalahan PHP |  Perbaiki Error Reporting for PHP - tangkapan layar backtrace

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

DTrace

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:

  1. Jalankan: sudo dtruss-php.d.
  2. Di jalankan terminal lain: php -r "phpinfo();".

Untuk mengujinya, Anda dapat pergi ke sembarang dokumen dengan index.phpdan 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


SystemTap

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

kenorb
sumber
0

+1 untuk print_r (). Gunakan itu untuk membuang konten suatu objek atau variabel. Untuk membuatnya lebih mudah dibaca, lakukan dengan tag pra sehingga Anda tidak perlu melihat sumber.

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

Juga var_dump ($ thing) - ini sangat berguna untuk melihat jenis subtitle

Polsonby
sumber
Versi panjang dapat ditemukan di sini devarticles.in/php/useful-function-to-output-debug-data-in-php
Arvind K.
Berikut ini adalah versi yang disempurnakan devarticles.in/php/useful-function-to-output-debug-data-in-php
Arvind K.
0

Tergantung pada masalah saya suka kombinasi dari error_reporting (E_ALL) dicampur dengan tes gema (untuk menemukan baris / file yang menyinggung kesalahan terjadi di initally; Anda TAHU itu tidak selalu baris / file php memberitahu Anda kan?), Pencocokan IDE brace benar?), Pencocokan IDE brace (untuk menyelesaikan masalah "Parse error: kesalahan sintaks, $ end tak terduga"), dan print_r (); keluar; dumps (programmer nyata melihat sumbernya; p).

Anda juga tidak dapat mengalahkan phpdebug (periksa sourceforge) dengan "memory_get_usage ();" dan "memory_get_peak_usage ();" untuk menemukan area masalah.

Eric Lamb
sumber
0

Debugger terintegrasi di mana Anda dapat menyaksikan nilai-nilai perubahan variabel saat Anda melangkah melalui kode benar-benar keren. Namun, mereka memerlukan pengaturan perangkat lunak pada server dan sejumlah konfigurasi pada klien. Keduanya membutuhkan perawatan berkala agar tetap berfungsi dengan baik.

Print_r mudah ditulis dan dijamin berfungsi dalam pengaturan apa pun.

Michael Luton
sumber
0

Biasanya saya menemukan membuat fungsi log kustom yang dapat menyimpan pada file, menyimpan informasi debug, dan akhirnya mencetak ulang pada catatan kaki yang umum.

Anda juga bisa mengesampingkan kelas Pengecualian umum, sehingga jenis debugging ini semi-otomatis.

Joshi Spawnbrood
sumber