11/08/2018, 20:42

Debug với Xdebug và Sublime Text

Viết code chạy một cách trơn tru ngay lần đầu tiên là một việc rất khó, thậm chí là bất khả thi. Do đó debug là một kỹ năng vô cùng quan trọng đối với mỗi lập trình viên. Mục đích của debug không chỉ là để phát hiện lỗi mà quan trọng hơn còn để giúp lập trình viên hiểu rõ hơn sự thực thi của chương ...

Viết code chạy một cách trơn tru ngay lần đầu tiên là một việc rất khó, thậm chí là bất khả thi. Do đó debug là một kỹ năng vô cùng quan trọng đối với mỗi lập trình viên. Mục đích của debug không chỉ là để phát hiện lỗi mà quan trọng hơn còn để giúp lập trình viên hiểu rõ hơn sự thực thi của chương trình. Trong bài viết này, chúng ta sẽ xem thử làm thế nào để có thể debug với Xdebug kết hợp với Sublime Text, một text editor rất phổ biến mà mình rất ưa thích.

Cài đặt và cấu hình Xdebug

Để cài đặt và cấu hình Xdebug trên Ubuntu, các bạn có thể tham khảo bài viết

Cài đặt package Xdebug trên Sublime Text

Một trong những thế mạnh của Sublime Text là bạn có thể mở rộng nó một cách dễ dàng với các package. Trong trường hợp này, chúng ta sẽ cài đặt package Xdebug Client.
Đầu tiên, hãy chắc chắn rằng bạn đã cài đặt package control. Sau khi cài đặt package control xong, bật Sublime Text. Ở đây mình sẽ thực hiện với Sublime Text 3, nhưng tất nhiên là Xdebug cũng hoạt động với cả Sublime Text 2. Mở cửa sổ câu lệnh tìm kiếm (Ctrl + Shift + P) và tìm "install package".
alt text
Tiếp đó chúng ta sẽ tìm package "Xdebug client"
alt text
Bước cuối cùng chúng ta phải làm là cấu hình project trong Sublime. Cách đơn giản nhất để làm điều này là mở thư mục gốc của project, chọn menu Project và chọn “Save projects as”. Nên lưu file này trong thư mục gốc của project, để có thể lưu nó trong hệ thống version control của bạn và bạn có thể cấu hình nó một cách dễ dàng.
Mở file vừa tạo ra, nội dung sẽ giống như thế này:

{
    "folders":
    [
        {
           "follow_symlinks": true,
           "path": "."
        }
    ]
}

Chúng ta sẽ bổ sung thêm một vài dòng:

{
    "folders":
    [
        {
            "follow_symlinks": true,
            "path": "."
        }
    ],
    "settings": {
        "xdebug": {
             "url": "http://my.local.website/",
        }
    }
}

Như bạn thấy, chúng ta chỉ cần thêm vào URL của ứng dụng web.

Chú ý: Nếu như project của bạn chạy trên local thì cần phải tạo virtual host.

Chúng ta có thể thiết lập nhiều cài đặt hơn cho Xdebug, nhưng thế này là đủ để bắt đầu. Cũng có thể thiết lập URL này trong chính cài đặt của Xdebug, nhưng trong trường hợp đó, chúng ta sẽ không thể làm việc trên nhiều project mà không cần phải thay đổi cấu hình Xdebug mỗi lần.

Debug với Xdebug

Bây giờ chúng ta có thể bắt đầu phiên làm việc của Xdebug và xem liệu mọi thứ đã được cài đặt đúng chưa.

Khởi động phiên làm việc cuả Xdebug

Trong menu, chọn Tools -> Xdebug và chọn Start debugging (launch browser). Bạn sẽ thấy trang web của bạn được mở ra và tham số ?XDEBUG_SESSION_START=sublime.xdebug được thêm vào cuối URL. Khi đó phiên làm việc của Xdebug sẽ bắt đầu. Trong Sublime, một số bảng phụ xuất hiện là nơi hiển thị thông tin debug, sau khi bạn đã đặt các breakpoints.
alt text

Breakpoints

Hãy đặt một breakpoint đầu tiên. Một breakpoint về cơ bản là một cái cờ nơi mà ứng dụng của bạn sẽ tạm dừng khi chạy đến đó. Tại thời điểm nó tạm dừng, bạn có thể kiểm tra giá trị tất cả các biến để bạn biết thực tế những gì đang xảy ra.
Chúng ta có thể thêm một breakpoint bằng cách click chuột phải trên một dòng, chọn Xdebug và chọn add/remove breakpoint. Một điểm đánh dấu sẽ được thêm vào lề của dòng đó để chỉ ra rằng một breakpoint đã được đặt.
alt text
Trên trình duyệt vừa được mở ra, ngay khi bạn đến trang nơi breakpoint được đặt, bạn sẽ thấy trang web sẽ ngừng tải. Mở Sublime và rất nhiều thông tin sẽ hiện ra trong các bảng của Xdebug.

Các Xdebug stackXdebug context rất thú vị.

  • Trong stack, bạn có thể nhìn thấy toàn bộ stacktrace mà bạn đã đi qua.
  • Trong context, bạn sẽ thấy tất cả các biến toàn cục, và cả các biến bạn tự định nghĩa. Bạn có thể click vào các biến để xem chính xác bên trong các biến. Ví dụ, trong hình dưới đây, tôi chọn biến $ _SERVER. alt text Chú ý rằng có một mũi tên màu vàng chỉ vào dòng mà tại đây ứng dụng đang dừng lại.

Tiến hành debug

Ứng dụng của chúng ta đã dừng lại và bây giờ chúng ta có thể xem qua các biến được định nghĩa. Tuy nhiên, chúng ta đã xem xong và muốn đi tiếp thì làm gì bây giờ? Khi bạn nhấp chuột phải một lần nữa chọn menu Xdebug, bạn sẽ có các lựa chọn:

  • Run: Chạy ứng dụng cho đến khi tới điểm dừng tiếp theo hoặc cho đến khi kết thúc.
  • Run to line: Chạy đến dòng bạn click vào.
  • Step into: Nhảy vào hàm hiện tại và dừng lại ngay sau đó.
  • Step over: Nhảy qua hàm hiện tại và dừng lại ngay sau đó.
  • Step out: Nhảy ra khỏi hàm hiện tại và dừng lại ngay sau đó.
  • Stop: Dừng việc sửa lỗi.
  • Detach: Cũng sẽ dừng việc sửa lỗi.

Chạy và dừng thì khá dễ hiểu, tuy nhiên các hàm nhảy có thể gây nhầm lẫn. Hãy xem một ví dụ đơn giản:

Class Foo()
{

    public function bar(Array $arr)
    {
        $arr = self::fooBar($arr); // Breakpoint
        return $arr;
    }

    public function fooBar(Array $arr)
    {
        return array_values($arr);
    }
}

Hãy tưởng tượng bạn thêm một breakpoint vào dòng đầu tiên của hàm bar, trên dòng có comment // Breakpoint

  • Với Step into, trình gỡ lỗi sẽ nhảy vào hàm fooBar và sẽ dừng lại ở dòng đầu tiên trong đó, tức là sẽ dừng ở dòng return array_values($arr);
  • Với Step over , nó sẽ gọi hàm, nhưng sẽ không dừng lại. Nó sẽ dừng lại ở dòng tiếp theo sau khi gọi hàm. Vì vậy, trong trường hợp này, nó sẽ dừng lại ở return $arr;
  • Cuối cùng, với Step out nó sẽ chạy qua toàn bộ hàm bar và trả về nơi đã gọi nó. Trong trường hợp này, nó sẽ nhảy ra ngoài của đối tượng, trở về đối tượng gọi gốc.
  • Nếu bạn cứ run, ứng dụng sẽ chạy thêm cho đến thời điểm nó được thực thi xong hoặc breakpoint khác xảy ra.

Kết luận

Trong bài viết này chúng ta đã biết cách tích hợp Xdebug với Sublime và phần nào hiểu được cách debug. Hy vọng sau bài viết này, các bạn sẽ không còn phải khổ sở var_dump tùm lum mỗi khi có bug nữa :D

Tham khảo

  • https://www.sitepoint.com/debugging-xdebug-sublime-text-3/
0