2011-12-05 26 views
7

Có cách nào để in dấu vết ngăn xếp thời gian chạy của quá trình Ruby 1.9.x không? Tôi biết rằng có một tiện ích được gọi là pstack cho Ruby 1.8, nhưng dự án dường như đã bị bỏ rơi một vài năm trước đây: https://github.com/ice799/pstack. Có bất cứ điều gì như thế này tồn tại cho Ruby 1.9? Cảm ơn rất nhiều!Làm cách nào để in dấu vết ngăn xếp thời gian chạy của quá trình Ruby 1.9?

EDIT: Tôi quan tâm đến việc sử dụng công cụ bên ngoài để tạo dấu vết ngăn xếp (không chạy trong cùng một không gian bộ nhớ như quy trình Ruby).

Như @mosch đã chỉ ra, phương thức Kernal#caller hoạt động từ bên trong tiến trình Ruby đang chạy.

Bạn thậm chí có thể xây dựng trong hỗ trợ cho mã Ruby của bạn mà bẫy tín hiệu xử lý và in một stack trace:

Signal.trap("SIGTERM") { p caller } 

tham khảo: http://www.ruby-doc.org/core-1.9.3/Signal.html

tôi có thể xây dựng chức năng này vào mã của tôi, nhưng tôi d thích sử dụng một giải pháp tổng quát hơn, bên ngoài. Cảm ơn.

Trả lời

3

Bất cứ khi nào bạn gọi phương thức Kernel caller, bạn sẽ nhận được ngăn xếp cuộc gọi hiện tại dưới dạng Mảng.

+0

Cảm ơn @mosch. Tôi đã cập nhật mô tả của mình để thêm một số làm rõ. –

0

Tôi đã đưa ra ý tưởng về điều này ngay hôm nay. Các pstack từ ice799 đã tận dụng gdb để gọi một hàm bên trong ruby ​​để đổ backtrace. Tuy nhiên, nó không làm việc cho 1.9 và yêu cầu một bản vá. Nó không thuận tiện như vậy.

Với may mắn, chúng tôi có hotpatch công cụ mạnh mẽ này. Nó có thể tiêm một .so vào một tiến trình đang chạy, chúng ta có thể thêm hàm cần thiết thông qua .so injection, pstack sẽ làm tất cả các phần còn lại. Tất nhiên các tiêm .so cần được nhị phân tương thích với lõi ruby ​​đang chạy, nhưng chúng tôi có thể giả định phần này là rất ổn định ngay bây giờ.

Các vấn đề liên quan