TracePoint trong Ruby

Tram Ho

Trong Ruby có một class có thể giúp bạn theo dõi một số hoạt động như gọi method, khai báo class, exception,… Và class đó là TracePoint. Nó khá hữu ích khi bạn muốn theo dõi và gọi một hàm cụ thể, bạn có thể xem hàm đó được gọi như thế nào, nó trả về gì.

Tạo một TracePoint

Dưới đây là một ví dụ tạo một TracePoint để theo dõi các lần gọi hàm từ một method:

Với event :call bạn có thể theo dõi được các lần Ruby gọi một method bất kỳ. Vì vậy bạn có thể ở trên ta có trace.enabletrace.disable để đảm bảo trace của chúng ta sẽ không theo chạy tất cả mọi lần mỗi lần có phương thức nào đó gọi, mà chỉ giới hạn trong một phạm vi nhất định.

Các sự kiện có thể theo dõi

Bảng bên dưới liệt kê các sự kiện mà TracePoint hỗ trợ (Ruby 2.5.0):

Tên sự kiệnMô tả
lineChạy code trên một dòng mới
classKhi bắt đầu định nghĩa một Class hoặc Module
endKhi kết thúc định nghĩa một Class hoặc Module
callGọi một hàm trong Ruby
returnTrả về từ một hàm trong Ruby
c_callGọi một hàm được viết bằng C
c_returnTrả về từ một hàm được viết bằng C
raiseKhi bắn ra một exception
b_callBắt đầu một block
b_returnKết thúc một block
thread_beginKhi bắt đầu một thread
thread_endKhi kết thúc một thread
fiber_switchkhi chuyển đổi ngữ cảnh

Fiber là một class trong Ruby dùng tạo các đoạn code có thể dừng và tiếp tục.

Các phương thức có sẵn

Bảng bên dưới liệt kê các phương thức mà TracePoint hỗ trợ (Ruby 2.5.0):

Tên phương thứcMô tả
bindingTrả về đối tượng binding tạo ra kèm sự kiện
defined_classTrả về Class hoặc Module mà phương thức đang được gọi
disableVô hiệu hoá TracePoint
enableKích hoạt TracePoint
enabled?Kiểm tra trạng thái hoạt động của TracePoint
eventTên sự kiện đang xảy ra
inspectTrả về một chuỗi chứa trạng thái TracePoint
linenoSố dòng xảy ra sự kiện
method_idTên phương thức được gọi
pathĐường dẫn của file đang chạy
raised_exceptionGiá trị trả về từ Exception của sự kiện :raise
return_valueTrả về giá trị từ các sự kiện :return, :c_return, :b_return
selfTrả về đối tượng đã tạo ra sự kiện

Vẽ luồng gọi hàm với TracePoint

Mình đã viết một gem để mô hình hoá một hàm trong ruby, với ví dụ ở đầu bài ta sẽ có:

Ví dụ về hàm tính số Fibonacci:

Code:

Kết luận

Hy vọng bài viết có thể giúp bạn hiểu rõ thêm về TracePoint trong Ruby.

Gem mình đã viết

https://github.com/muoihai-com/visual_call_html

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo