Tag Archive ดีบัก

Byphunsanit

php: xdebug

การเขียน unit testing หรือทำ uat โปรแกรมที่เขียนว่ามีข้อบกพร่องบ้างหรือเปล่า การ debug ใน php จะนิยมใช้ XDEBUG EXTENSION FOR PHP การติดตั้ง xdebug ใน xampp ไม่ยากเลย (ง่ายกว่าใน docker ตั้งเยอะ) ผมเคยเขียนการติดตั้งไว้ใน ตรวจสอบโค้ดและวัดความเร็ว PHP ด้วย xdebug แต่ไม่ได้อธิบายขั้นตอนอย่างละเอียดเอาไว้ ครั้งนี้จะเขียนวิธีอย่างละเอียด

การติดตั้ง xdebug

  1. download extension มาจาก XDEBUG EXTENSION FOR PHP | DOWNLOADS
    แต่ถ้าไม่แน่ใจ ทางผู้พัฒนาได้ทำ Tailored Installation Instructions ไว้ให้ แค่ copy หน้า phpinfo ของเว็บที่เราใช้มาวางใน textarea แล้วกด Analyse my phpinfo() output ก็จะได้ version และ config มาแล้ว
  2. นำไฟล์ .dll ไปไว้ใน php’s Extensions directory: เช่น C:\xampp\php\ext
  3. เปิดไฟล์ php’s Configuration File: เช่น C:\xampp\php\php.ini เพิ่มคอนฟิก
    [Xdebug]
    xdebug.profiler_append = 1
    xdebug.profiler_enable = 0
    xdebug.profiler_enable_trigger = 0
    xdebug.profiler_output_dir = "C:\xampp\tmp"
    xdebug.profiler_output_name = cachegrind.out.%t.%p
    xdebug.remote_enable = true
    xdebug.remote_handler = "dbgp"
    xdebug.remote_host = "localhost"
    xdebug.remote_port = 9000
    xdebug.trace_output_dir = "C:\xampp\tmp"
    zend_extension = "C:\xampp\php\ext\php_xdebug-2.5.5-7.1-vc14.dll"

    ด้านล่างของไฟล์

  4. เปิดและปิด Apache ใหม่อีกครั้ง

เปิดหน้า phpinfo อีกครั้ง ลองค้นหาคำว่า xdebug อีกครั้ง ถ้าเจอแปลว่าการติดตั้งเสร็จแล้ว

Byphunsanit

PHP: ดูการทำงานสร้าง flowchart (backtrace)

ถ้าเรียนเขียน program มาคงจะคุ้นเคยกับ flowchart การทำงานของของโปรแกรม แต่ในชีวิตการทำงานจริงๆ โดยเฉพาะถ้าเขียน code โดยใช้ framework ต่างๆ จะไม่เป็นเหมือนที่ได้ออกแบบไว้เสมอไป เพราะว่าบางครั้งโปรแกรมจะทำงานให้เราเองโดยที่ไม่ได้สั่ง สาเหตุคือ มีการเรียกใช้ hook หรือ tricker ทำให้เกิด process ที่อาจจะไม่ทราบที่มา หรือต้องมาแก้งานของคนอื่นโดนที่ไม่มีเอกสารให้

นอกจากการใช้วิธี PHP: list included หรือ required ไฟล์ที่ใช้ ถ้าเราใช้ตัว framework ต่างๆ มักจะมีการเตรียม function ในการสร้าง backtrace ไว้ให้ แต่ถ้าไม่มีหรือเป็น code ที่เขียนด้วยตัวเอง ยังสามารถใช้ debug_backtrace ในการค้นหาที่มาที่ไปได้เช่น

<?php

function getBacktrace()
{
    $backtrace = debug_backtrace();
    echo '<pre>', print_r($backtrace, true), '</pre>';
    fwrite(fopen('logs_debug_backtrace.txt', 'a+'), "\n\n" . __FILE__ . ' :' . __LINE__ . "\n\n" . print_r($backtrace, true));
}

function getPhpInfo($what)
{
    phpinfo($what);

    /* จะดูว่า ทำไม่ getPhpInfo ถึงทำงาน */
    getBacktrace();
}

function index()
{
    getPhpInfo(INFO_ENVIRONMENT);
}

index();

เมื่อทดสอบดูจะได้ผลลัพธ์

Array
(
    [0] => Array
        (
            [file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
            [line] => 13
            [function] => getBacktrace
            [args] => Array
                (
                )

        )

    [1] => Array
        (
            [file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
            [line] => 18
            [function] => getPhpInfo
            [args] => Array
                (
                    [0] => 16
                )

        )

    [2] => Array
        (
            [file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
            [line] => 21
            [function] => index
            [args] => Array
                (
                )

        )

)

เพราะว่าเราเขียน function debug_backtrace() ไว้ใน function getBacktrace() อีกชั้น เพื่อที่ความง่ายในการค้นหา flow เมื่อต้องการดูว่า function หรือ class ที่เราสนใจมันมี flow มายังไงก็แค่ไปเรียกใน function ที่สงสัย เราก็จะได้ลำดับการทำงานย้อนกลับไป เราจะได้ทราบทั้งฟังก์ชั้น คลาส บรรทัด ไฟล์ แม้แต่ตัวแปรที่ส่งเข้าไปใน function นั้นๆ