คุณดีบักสคริปต์ PHP อย่างไร [ปิด]


403

คุณดีบักสคริปต์PHPอย่างไร

ฉันตระหนักถึงการดีบักพื้นฐานเช่นการใช้การรายงานข้อผิดพลาด การดีบักเบรกพอยต์ในPHPEclipseก็มีประโยชน์เช่นกัน

อะไรคือวิธีที่ดีที่สุด (ในแง่ของวิธีที่ง่ายและรวดเร็ว) ในการดีบักใน phpStorm หรือ IDE อื่น ๆ


ดูเพิ่มเติมที่: stackoverflow.com/questions/4640421/…
kenorb


40
ฉันเชื่อว่านี่เป็นคำถามที่ยอดเยี่ยม! เมื่อคุณไม่รู้วิธีเข้าใกล้การดีบัก PHP คุณจะไม่รู้ด้วยซ้ำว่าจะถามคำถามของคุณอย่างไรไม่รู้วิธีที่แม่นยำกว่านี้ ดังนั้นอาจไม่เป็นไปตามกฎของ Stack แต่แน่นอนช่วยเราเริ่มต้นมาก!
Mihaela

1
จาก php5.4 เป็นต้นไปแนะนำการดีบักเกอร์อินเตอร์เฟสบรรทัดคำสั่งใหม่ที่เรียกว่า phpdbg ( phpdbg.com ) PHP5.6 จะมาพร้อมกับ phpdbg เริ่มต้น
Ganesh Patil

1
เคยได้ยิน XDebug ไหม? :)
Pratik

คำตอบ:


145

ลองEclipse PDTเพื่อตั้งค่าสภาพแวดล้อม Eclipse ที่มีคุณสมบัติการดีบักอย่างที่คุณพูดถึง ความสามารถในการก้าวเข้าสู่โค้ดเป็นวิธีที่ดีกว่าในการดีบักวิธีเก่าของ var_dump และพิมพ์ตามจุดต่าง ๆ เพื่อดูว่าการไหลของคุณผิดไปอย่างไร เมื่อสิ่งอื่นล้มเหลวและทั้งหมดที่ฉันมีคือ SSH และกลุ่มฉันยังvar_dump()/ die()เพื่อค้นหาว่ารหัสไปทางทิศใต้


35
คุณควรใช้ฟังก์ชันนี้: kill ($ data) {die (var_dump ($ data)); } จะช่วยประหยัดการพิมพ์ 10 ตัวอักษร, ฟังก์ชั่นที่ดีที่สุดเท่าที่ผมเคยเขียน TBH :)
AlexMorley-กระจอก


2
มีวิธีในการตกแต่ง "var_dump" หรือไม่?
RPDeshaies

6
@ AlexMorley-Finch ฉันยกระดับให้คุณkill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; }
Francisco Presencia

2
ลิงก์คือ "กู้คืนได้" ผ่านทางคลังเว็บที่น่าทึ่งตรวจสอบครั้งสุดท้ายเมื่อวันที่ 7 พฤษภาคม '15
Gruber

80

คุณสามารถใช้ Firephp ส่วนเสริมเพื่อ firebug เพื่อดีบัก php ในสภาพแวดล้อมเดียวกันกับ javascript

ฉันยังใช้Xdebug ที่กล่าวถึงก่อนหน้านี้สำหรับการทำโปรไฟล์ php


3
และนี่คือคำแนะนำโดยย่อเกี่ยวกับการใช้ FirePHP: sitepoint.com/debug-php-firebug-firephp
Mihaela

38

นี่คือสภาพแวดล้อมการแก้ปัญหาเล็กน้อยของฉัน:

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
ขอบคุณ. นั่นช่วยชีวิตฉันไว้ (ฉันต้องลบ E_STRICT นั้นออกไป)
วินาทีที่

4
assert_callcackheh
Madbreaks

32

Xdebug และปลั๊กอิน DBGp สำหรับ Notepad ++ สำหรับการหาบั๊กแบบหนัก, FirePHP สำหรับสิ่งที่มีน้ำหนักเบา รวดเร็วและสกปรก? ไม่มีอะไรเต้นdBug


ปลั๊กอิน DBGp ไม่ทำงานกับ notepad ++ / xdebug เวอร์ชันปัจจุบันและไม่มีแผนที่จะแก้ไข คุณสามารถดูการสนทนาของฉันกับผู้สร้างที่ลิงก์ได้ที่นี่
โจ

26

XDebugเป็นสิ่งจำเป็นสำหรับการพัฒนา ฉันติดตั้งก่อนส่วนขยายอื่น ๆ มันทำให้คุณมีร่องรอยสแต็กในข้อผิดพลาดใด ๆ และคุณสามารถเปิดใช้งานการทำโปรไฟล์ได้อย่างง่ายดาย

var_dump()สำหรับดูอย่างรวดเร็วที่ใช้โครงสร้างข้อมูล อย่าใช้print_r()เพราะคุณจะต้องล้อมรอบด้วย<pre>และจะพิมพ์ทีละครั้งเท่านั้น

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

สำหรับสภาพแวดล้อมการดีบักที่ดีที่สุดที่ฉันพบคือKomodo IDEแต่ราคา $$


19

phpEd นั้นดีจริงๆ คุณสามารถเข้า / ออก / ฟังก์ชั่นได้ คุณสามารถเรียกใช้โค้ด ad-hoc ตรวจสอบตัวแปรเปลี่ยนตัวแปร มันวิเศษมาก


4
ฉันใช้ PhpEd และฉันไม่มีคำพูดที่ดีเมื่อเปรียบเทียบกับ IDE จริงเช่น NetBeans หรือ Eclipse ความคิดเห็นนี้ไม่เพิ่มสิ่งใด ๆ ที่เป็นประโยชน์ต่อคำถาม -1
siliconrockstar

ฉันลอง IDEs ส่วนใหญ่ (รวมถึง Zend, NetBeans และ Eclipse) ก่อนที่จะซื้อ PhpED Professional เพราะมันดีที่สุดในหนึ่งไมล์ครึ่ง นี่เป็นไม่กี่ปีที่ผ่านมาดังนั้นคนอื่น ๆ อาจจะได้รับการปรับปรุงให้ดีขึ้น แต่ในเวลานั้นส่วนใหญ่ของพวกเขาช้าลงอย่างเจ็บปวดเพราะพวกเขาเขียนด้วยภาษาจาวา ฉันไม่เข้าใจว่าใครบางคนสามารถมี "คำพูดที่ไม่สุภาพ" เมื่อใด (สำหรับฉัน) มันชัดเจนที่สุดการตัดสินใจไม่ใช่เรื่องง่าย
lm713

17

1) ฉันใช้ print_r () ใน TextMate ฉันมีตัวอย่างสำหรับ 'pre' ซึ่งขยายไปถึงสิ่งนี้:

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

2) ฉันใช้ Xdebug แต่ไม่สามารถทำให้ GUI ทำงานได้บน Mac ของฉัน อย่างน้อยจะพิมพ์สแต็กการติดตามสแต็กรุ่นที่อ่านได้


ฉันแน่ใจว่าคุณหมายถึงเสียงสะท้อน "</pre>"; ในตอนท้ายว่า
altermativ

9
นอกจากนี้คุณยังสามารถส่ง 'จริง' ลงในฟังก์ชันเพื่อให้ส่งคืนสตริงได้ หมายความว่าคุณสามารถทำได้:echo '<pre>', print_r($var, true), '</pre>';
ไม่พอใจ Goat


16

ในความซื่อสัตย์ทั้งหมดการรวมกันของการพิมพ์และ print_r () เพื่อพิมพ์ตัวแปร ฉันรู้ว่าหลายคนชอบที่จะใช้วิธีการขั้นสูงอื่น ๆ แต่ฉันพบว่าวิธีนี้ใช้ง่ายที่สุด

ฉันจะบอกว่าฉันไม่ได้ชื่นชมสิ่งนี้อย่างเต็มที่จนกระทั่งฉันได้เขียนโปรแกรมไมโครโปรเซสเซอร์ที่ Uni และไม่สามารถใช้งานได้


ฉันดีใจที่คุณพูดถึงการพิมพ์เช่นเดียวกับ print_r ฉันใช้การพิมพ์ขั้นพื้นฐานเพื่อดูว่ารหัสถูกประหารชีวิตไปยังจุดหนึ่งซึ่งช่วยแยกปัญหาหรือไม่
แบรด

ฉันใช้ทั้งการพิมพ์และ var_dump () ฉันใช้การพิมพ์เพื่อแสดงข้อความและข้อมูลการดีบักและ var_dump เพื่อระบุสถานะของตัวแปรว่ามีความคืบหน้า
Joshua K

14

Xdebugโดย Derick Rethans ดีมาก ฉันใช้มันเมื่อไม่นานมานี้และพบว่าไม่ใช่เรื่องง่ายที่จะติดตั้ง เมื่อคุณทำเสร็จแล้วคุณจะไม่เข้าใจวิธีการจัดการหากไม่มี :-)

มีบทความที่ดีเกี่ยวกับZend Developer Zone (การติดตั้งบน Linux ดูเหมือนจะไม่ง่ายขึ้น) และแม้แต่ปลั๊กอิน Firefoxซึ่งฉันไม่เคยใช้


2
มันไม่ได้เป็นเพียงแค่การติดตั้งที่น่าผิดหวัง การกำหนดค่า Xdebug ให้ทำงานกับ Eclipse อาจเป็นฝันร้าย ฉันสามารถติดตั้ง Xdebug บน CentOS 5 ได้ แต่ EclipsePDT + Xdebug ไม่ต้องการทำงานร่วมกัน :(
Jahangir


11

ฉันใช้ Netbeans กับ XDebug และEasy XDebug FireFox Add-on

โปรแกรมเสริมเป็นสิ่งจำเป็นเมื่อคุณทำการดีบักโครงการ MVC เนื่องจากวิธีปกติที่ XDebug ทำงานใน Netbeans คือการลงทะเบียนเซสชัน dbug ผ่านทาง url เมื่อติดตั้งส่วนเสริมใน FireFox คุณจะต้องตั้งค่าคุณสมบัติโครงการ Netbeans ของคุณ -> เรียกใช้ Configuratuion -> ขั้นสูงและเลือก "อย่าเปิดเว็บเบราว์เซอร์" ตอนนี้คุณสามารถกำหนดจุดพักและเริ่มเซสชันการดีบักด้วย Ctrl-F5 ตามปกติ . เปิด FireFox และคลิกขวาที่ไอคอน Add-on ที่มุมล่างขวาเพื่อเริ่มการตรวจสอบจุดพัก เมื่อรหัสถึงจุดพักมันจะหยุดและคุณสามารถตรวจสอบสถานะตัวแปรและ call-stack ของคุณ


10

การบัฟเฟอร์ออกมีประโยชน์มากถ้าคุณไม่ต้องการทำให้การส่งออกของคุณยุ่งเหยิง ฉันทำสิ่งนี้ในสายการบินเดียวซึ่งฉันสามารถแสดงความคิดเห็น / ไม่แสดงความคิดเห็นตามที่ประสงค์

 ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();

สิ่งนี้อาจเป็นประโยชน์ในการdevarticles.in/php/useful-function-to-output-debug-data-in-php
Arvind K.


8

สำหรับปัญหาที่หนักหน่วงจริง ๆ ที่ใช้เวลานานเกินไปในการใช้ print_r / echo เพื่อหาว่าฉันใช้คุณสมบัติการดีบัก IDE (PhpEd) ของ IDE แล้ว แตกต่างจาก IDE อื่น ๆ ที่ฉันเคยใช้ PhpEd ไม่ต้องติดตั้งอะไรเลย เหตุผลเดียวที่ฉันไม่ใช้มันสำหรับปัญหาใด ๆ ที่ฉันพบคือความเจ็บปวดช้า ฉันไม่แน่ใจว่าความเชื่องช้านั้นจำเพาะกับ PhpEd หรือดีบักเกอร์ php ใด ๆ phpEd ไม่ฟรี แต่ฉันเชื่อว่ามันใช้หนึ่งใน debuggers โอเพนซอร์ส (เช่น XDebug ที่กล่าวถึงก่อนหน้า) ต่อไป ประโยชน์กับ PhpEd อีกครั้งคือมันไม่จำเป็นต้องติดตั้งซึ่งฉันพบว่าค่อนข้างน่าเบื่อในอดีต


2
ดีบักเกอร์ PHPEd เขียนโดยคนเดียวกับที่เขียน PHPEd และฉันค่อนข้างมั่นใจว่ามันไม่ใช่โอเพ่นซอร์ส อย่างน้อย PHPEd ไม่ได้ส่งมาพร้อมกับแหล่งที่มา แต่รวบรวมคอมไพล์. so และ. dll แทน
Artem Russakovskii

4

การดีบักแบบแมนนวลนั้นเร็วสำหรับฉัน - var_dump()และdebug_print_backtrace()เป็นเครื่องมือทั้งหมดที่คุณต้องใช้ในการจัดวางตรรกะของคุณ


3

ดีขึ้นอยู่กับว่ามันจะไปทางไหน นั่นเป็นสิ่งแรกที่ฉันพยายามแยกจากนั้นฉันจะใช้ echo / print_r () ตามความจำเป็น

หมายเหตุ: พวกคุณรู้หรือไม่ว่าคุณสามารถส่งผ่านความจริงเป็นอาร์กิวเมนต์ที่สองเพื่อ print_r () และมันจะส่งกลับผลลัพธ์แทนการพิมพ์หรือไม่ เช่น:

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

2
ฉันเพิ่งตัดมันในฟังก์ชันที่เรียกว่า debug ดังนั้นฉันสามารถดีบัก ($ var);
jdelator

3

ฉันมักจะใช้ CakePHP เมื่อไม่สามารถใช้ Rails ได้ เพื่อแก้ไขข้อผิดพลาดฉันมักจะพบerror.logในโฟลเดอร์ tmp และหางใน terminal ด้วยคำสั่ง ...

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

มันให้คุณใช้กล่องโต้ตอบจากเค้กของสิ่งที่เกิดขึ้นซึ่งเป็นประโยชน์มากถ้าคุณต้องการที่จะส่งออกบางสิ่งบางอย่างเพื่อมันรหัสกลางที่คุณสามารถใช้

$this->log('xxxx');

โดยปกติจะทำให้คุณมีความคิดที่ดีว่าเกิดอะไรขึ้น / ผิด



2

Komodo IDE ทำงานได้ดีกับ xdebug แม้สำหรับการดีบัก remore ต้องการการกำหนดค่าขั้นต่ำ สิ่งที่คุณต้องมีคือรุ่นของ php ที่โคโมโดสามารถใช้ในพื้นที่เพื่อโค้ดผ่านจุดพัก หากคุณมีสคริปต์ที่นำเข้าสู่โครงการโคโมโดแล้วคุณสามารถตั้งค่าเบรกพอยต์ด้วยการคลิกเมาส์เพียงวิธีที่คุณจะตั้งไว้ใน eclipse สำหรับการแก้จุดบกพร่องโปรแกรมจาวา เห็นได้ชัดว่าการดีบักแบบรีโมตนั้นยุ่งยากกว่าเพื่อให้ทำงานได้อย่างถูกต้อง (คุณอาจต้องแม็พ URL ระยะไกลกับสคริปต์ php ในพื้นที่ทำงานของคุณ) กว่าการตั้งค่าการดีบักแบบโลคัลซึ่งค่อนข้างง่ายต่อการกำหนดค่าหากคุณใช้ MAC หรือ Linux .



2

มีเทคนิคการดีบัก PHP มากมายที่สามารถช่วยคุณประหยัดเวลานับไม่ถ้วนเมื่อการเข้ารหัส เทคนิคการแก้จุดบกพร่องที่มีประสิทธิภาพ แต่พื้นฐานคือเพียงแค่เปิดการรายงานข้อผิดพลาด เทคนิคขั้นสูงอีกเล็กน้อยที่เกี่ยวข้องกับการใช้คำสั่งพิมพ์ซึ่งสามารถช่วยระบุข้อบกพร่องที่เข้าใจยากมากขึ้นโดยการแสดงสิ่งที่เกิดขึ้นจริงบนหน้าจอ PHPeclipse เป็นปลั๊กอิน Eclipse ที่สามารถเน้นข้อผิดพลาดทางไวยากรณ์ทั่วไปและสามารถใช้ร่วมกับดีบักเกอร์เพื่อตั้งจุดพัก

display_errors = Off
error_reporting = E_ALL 
display_errors = On

และยังใช้

error_log();
console_log();

1

ในสภาพแวดล้อมการใช้งานจริงฉันบันทึกข้อมูลที่เกี่ยวข้องลงในบันทึกข้อผิดพลาดของเซิร์ฟเวอร์ด้วย error_log ()


และดีกว่าหาง -f ... ใช้งานได้ดี
markus_p

1

ฉันใช้สตูดิโอ zend สำหรับ eclipse กับดีบักเกอร์ในตัว มันยังคงช้าเมื่อเทียบกับการดีบักด้วย eclipse pdt กับ xdebug หวังว่าพวกเขาจะแก้ไขปัญหาเหล่านั้นความเร็วได้ดีขึ้นกว่ารุ่นล่าสุด แต่ก็ยังคงต้องใช้เวลา 2-3 วินาที แถบเครื่องมือ zend firefox ทำให้ทุกอย่างเป็นเรื่องง่าย (แก้ไขหน้าถัดไปหน้าปัจจุบัน ฯลฯ ) นอกจากนี้ยังให้บริการผู้สร้างโปรไฟล์ที่จะวัดรหัสของคุณและจัดทำแผนภูมิวงกลมเวลาดำเนินการ ฯลฯ


1

ข้อผิดพลาดส่วนใหญ่นั้นสามารถพบได้ง่ายเพียงแค่ใส่var_dumpตัวแปรหลักบางตัว แต่มันก็ขึ้นอยู่กับประเภทของแอพพลิเคชันที่คุณพัฒนา

สำหรับอัลกอริทึมที่ซับซ้อนยิ่งขึ้นฟังก์ชัน step / เบรกพอยต์ / นาฬิกามีประโยชน์มาก (หากไม่จำเป็น)


1

PHP DBG

PHP Debugger แบบอินเทอร์แอกทีฟใช้งานเป็นโมดูล SAPI ซึ่งสามารถให้คุณควบคุมสภาพแวดล้อมได้อย่างสมบูรณ์โดยไม่กระทบต่อการทำงานหรือประสิทธิภาพของโค้ดของคุณ มันมีจุดมุ่งหมายที่จะเป็นแพลตฟอร์มการแก้ไขข้อบกพร่องที่มีน้ำหนักเบาและมีประสิทธิภาพและใช้งานง่ายสำหรับ PHP 5.4+ และได้จัดส่งไปพร้อมกับ PHP 5.6

คุณสมบัติรวมถึง:

  • การดีบักขั้นสูง
  • จุดพักแบบยืดหยุ่น (วิธีการเรียน, ฟังก์ชั่น, ไฟล์: เส้น, ที่อยู่, รหัส)
  • เข้าถึง PHP ได้ง่ายด้วย eval ในตัว ()
  • เข้าถึงรหัสที่กำลังดำเนินการได้ง่าย
  • Userland API
  • SAPI Agnostic - ผสานรวมได้อย่างง่ายดาย
  • รองรับไฟล์การกำหนดค่า PHP
  • JIT Super Globals - ตั้งของคุณเอง !!
  • การสนับสนุน readline เพิ่มเติม - การใช้งานเทอร์มินัลที่สะดวกสบาย
  • การสนับสนุนการดีบักระยะไกล - Java GUI ที่ให้มา
  • ใช้งานง่าย

ดูภาพหน้าจอ:

PHP DBG - แก้จุดบกพร่องขั้นสูง - สกรีนช็อต

PHP DBG - แก้จุดบกพร่องขั้นสูง - สกรีนช็อต

หน้าแรก: http://phpdbg.com/

PHP Error - การรายงานข้อผิดพลาดที่ดีกว่าสำหรับ PHP

นี่เป็นห้องสมุดที่ใช้งานง่ายมาก (จริง ๆ แล้วเป็นไฟล์) เพื่อดีบักสคริปต์ PHP ของคุณ

สิ่งเดียวที่คุณต้องทำคือการรวมไฟล์หนึ่งไฟล์ไว้ด้านล่าง (ที่จุดเริ่มต้นในรหัสของคุณ):

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

จากนั้นข้อผิดพลาดทั้งหมดจะให้ข้อมูลเช่น backtrace บริบทรหัสอาร์กิวเมนต์ฟังก์ชันฟังก์ชันตัวแปรเซิร์ฟเวอร์เป็นต้นตัวอย่างเช่น

ข้อผิดพลาด PHP  ปรับปรุงการรายงานข้อผิดพลาดสำหรับ PHP - ภาพหน้าจอของ backtrace ข้อผิดพลาด PHP  ปรับปรุงการรายงานข้อผิดพลาดสำหรับ PHP - ภาพหน้าจอของ backtrace ข้อผิดพลาด PHP  ปรับปรุงการรายงานข้อผิดพลาดสำหรับ PHP - ภาพหน้าจอของ backtrace

คุณสมบัติรวมถึง:

  • เรื่องเล็กน้อยที่จะใช้มันเป็นเพียงไฟล์เดียว
  • ข้อผิดพลาดที่แสดงในเบราว์เซอร์สำหรับคำขอปกติและ ajaxy
  • คำขอ AJAX ถูกหยุดชั่วคราวทำให้คุณสามารถเรียกใช้ซ้ำได้โดยอัตโนมัติ
  • ทำข้อผิดพลาดอย่างเข้มงวดเท่าที่จะทำได้ (กระตุ้นให้มีคุณภาพรหัสและมีแนวโน้มที่จะปรับปรุงประสิทธิภาพ)
  • ตัวอย่างโค้ดข้ามการติดตามสแต็กทั้งหมด
  • ให้ข้อมูลเพิ่มเติม (เช่นลายเซ็นฟังก์ชั่นเต็มรูปแบบ)
  • แก้ไขข้อผิดพลาดบางอย่างซึ่งเป็นเพียงผิดธรรมดา
  • การเน้นไวยากรณ์
  • ดูน่ารัก!
  • การปรับแต่ง
  • เปิดและปิดด้วยตนเอง
  • เรียกใช้ส่วนเฉพาะโดยไม่มีการรายงานข้อผิดพลาด
  • ละเว้นไฟล์ที่อนุญาตให้คุณหลีกเลี่ยงการไฮไลต์รหัสในการติดตามสแต็กของคุณ
  • ไฟล์แอปพลิเคชัน สิ่งเหล่านี้จะถูกจัดลำดับความสำคัญเมื่อเกิดข้อผิดพลาด!

หน้าแรก: http://phperror.net/

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

ทางแยกของฉัน (พร้อมการแก้ไขเพิ่มเติม): https://github.com/kenorb-contrib/PHP-Error

DTrace

หากระบบของคุณรองรับการติดตาม DTrace แบบไดนามิก (ติดตั้งโดยค่าเริ่มต้นใน OS X) และ PHP ของคุณถูกคอมไพล์ด้วยโพรบ DTrace ที่เปิดใช้งาน ( --enable-dtrace) ซึ่งควรเป็นค่าเริ่มต้นคำสั่งนี้สามารถช่วยคุณในการดีบักสคริปต์ 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); }'

ดังนั้นเมื่อให้นามแฝงต่อไปนี้ถูกเพิ่มลงในไฟล์rcของคุณ(เช่น~/.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); }"'

trace-phpคุณอาจติดตามสคริปต์ของคุณกับง่ายต่อการจำนามแฝง:

นี่คือสคริปต์ dtrace ขั้นสูงเพิ่มเติมเพียงบันทึกลงในdtruss-php.dไฟล์ทำให้สามารถchmod +x dtruss-php.dเรียกใช้งานได้( ) และเรียกใช้:

#!/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));
}

หน้าแรก: dtruss-lampที่ GitHub

นี่คือการใช้งานที่เรียบง่าย:

  1. sudo dtruss-php.dเรียกใช้:
  2. ในการรันเทอร์มินัลอื่น: php -r "phpinfo();".

เพื่อทดสอบว่าคุณสามารถไปที่ docroot ด้วยindex.phpและเรียกใช้เซิร์ฟเวอร์ PHP builtin โดย:

php -S localhost:8080

หลังจากนั้นคุณสามารถเข้าถึงไซต์ได้ที่http: // localhost: 8080 / (หรือเลือกพอร์ตใดก็ได้ที่คุณสะดวก) จากตรงนั้นเข้าถึงบางหน้าเพื่อดูผลลัพธ์การติดตาม

หมายเหตุ: DTrace สามารถใช้ได้บน OS X โดยค่าเริ่มต้นบน Linux คุณอาจจำเป็นต้องdtrace4linuxหรือตรวจสอบอื่น ๆ บางทางเลือก

ดู: การใช้ PHP และ DTraceที่ php.net


SystemTap

หรือตรวจสอบการติดตาม SystemTap โดยติดตั้งแพ็คเกจพัฒนา SystemTap SDT (เช่นyum install systemtap-sdt-devel)

นี่คือตัวอย่างสคริปต์ ( all_probes.stp) สำหรับการติดตามจุดโพรบสแตติก PHP หลักทั้งหมดตลอดระยะเวลาของสคริปต์ PHP ที่รันด้วย 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));
}

การใช้งาน:

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

ดู: การใช้ SystemTap กับ PHP DTrace Static Probesที่ php.net


0

+1 สำหรับ print_r () ใช้มันเพื่อทิ้งเนื้อหาของวัตถุหรือตัวแปร หากต้องการทำให้อ่านง่ายขึ้นให้ทำด้วยแท็กล่วงหน้าเพื่อให้คุณไม่จำเป็นต้องดูแหล่งที่มา

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

นอกจากนี้ยังมี var_dump ($ สิ่งของ) - มันมีประโยชน์มากในการดูประเภทของสิ่งย่อย


รุ่นขยายสามารถพบได้ที่นี่devarticles.in/php/useful-function-to-output-debug-data-in-php
Arvind K.


0

ฉันชอบชุดของ error_reporting (E_ALL) ผสมกับการทดสอบ echo (เพื่อหาข้อผิดพลาดที่เกิดขึ้นบรรทัด / ไฟล์ข้อผิดพลาดที่เกิดขึ้นในตอนแรกคุณรู้หรือไม่ว่า php สาย / ไฟล์บอกคุณใช่ไหม?) การจับคู่ IDE วงเล็บปีกกา (เพื่อแก้ไข "ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดทางไวยากรณ์, ปัญหา $ end" ที่ไม่คาดคิด) และ print_r (); ออกจาก; ดัมพ์ (โปรแกรมเมอร์จริงดูที่ซอร์ส; p)

คุณไม่สามารถเอาชนะ phpdebug (ตรวจสอบซอร์สโค้ด) ด้วย "memory_get_usage ();" และ "memory_get_peak_usage ();" เพื่อค้นหาพื้นที่ที่มีปัญหา


0

ตัวดีบั๊กแบบรวมที่คุณสามารถดูค่าของการเปลี่ยนแปลงตัวแปรเมื่อคุณก้าวผ่านโค้ดนั้นยอดเยี่ยมจริงๆ อย่างไรก็ตามต้องมีการตั้งค่าซอฟต์แวร์บนเซิร์ฟเวอร์และการกำหนดค่าจำนวนหนึ่งบนไคลเอนต์ ทั้งสองอย่างนี้ต้องการการบำรุงรักษาเป็นระยะเพื่อให้ทำงานได้ดี

print_r นั้นง่ายต่อการเขียนและรับประกันว่าจะทำงานในการตั้งค่าใด ๆ


0

ฉันมักจะพบว่าสร้างฟังก์ชั่นบันทึกที่กำหนดเองที่สามารถบันทึกในไฟล์จัดเก็บข้อมูลการแก้ปัญหาและในที่สุดก็พิมพ์อีกครั้งบนส่วนท้ายที่พบบ่อย

คุณยังสามารถแทนที่คลาส Exception ทั่วไปเพื่อให้การดีบักประเภทนี้เป็นแบบกึ่งอัตโนมัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.