2012-01-02 15 views
15

Nếu tôi sử dụng gcore để tạo kết xuất mã của quy trình Node.js, các công cụ tốt nhất để phân tích nó là gì?Công cụ phân tích kết xuất lõi từ Node.js

Lấy cảm hứng từ: Tool for analyzing java core dump

Trong trường hợp cụ thể của tôi, tôi quan tâm trong việc điều tra một số rò rỉ bộ nhớ, vì vậy tôi thực sự tò mò để có được một số phân tích đống. Các công cụ chung và các gói kỹ thuật và thiết bị thậm chí còn được chào đón. Tôi đang tìm Node.js rất thú vị, nhưng các công cụ phân tích thời gian chạy vẫn chưa có.

Trả lời

16

Để điều tra sự cố, tôi đã tìm thấy node-segfault-handler là vô giá. Đó là một mô-đun tôi đã nấu chín để có được một dấu vết stack mã nguồn trong trường hợp một vụ tai nạn cứng với một tín hiệu - ví dụ như deref của NULL dẫn đến SIGSEGV

Để điều tra vấn đề bộ nhớ/phân bổ, đây là một số dữ liệu tôi đã được thu thập từ trước đến nay:

1) Blog post by Dave Patheco - tác giả nói về việc sử dụng plugin cho MDB để nhận các ngăn xếp JS và như vậy. Đáng buồn thay, theo như tôi có thể nói, nguồn của plugin đó không bao giờ được phát hành (cũng không phải bất kỳ dạng nhị phân nào).

2) Postmortem Debugging in Dynamic Environments - Bài viết ACM hàng đợi cũng được viết bởi Dave Patheco (được liên kết từ bài đăng trên blog). Trong khi nó làm cho đọc nền GREAT, bài viết không có nhiều công cụ và kỹ thuật cụ thể trong đó.

3) node-panic - Một công cụ thuần JS cho trạng thái bán phá giá trong trường hợp xảy ra sự cố kiểu lỗi xác nhận. Không có gì để giúp gỡ lỗi các sự cố bắt nguồn từ lỗi mã nguồn gốc (SIGSEGV, v.v.)

4) Joyent: Debugging Production Systems - nói chuyện với Bryan Cantrill về các công cụ và kỹ thuật mà anh ta khuyên dùng (thx crickeys).

+1

Chỉ cần nhìn này (http://www.infoq.com/presentations/Debugging-Production-Systems). Tôi nghĩ rằng bạn phải chạy một smartos từ joyent vì vậy bạn có thể sử dụng mdb trên tập tin lõi, nhưng tôi không thực sự chắc chắn. – crickeys

+0

Cảm ơn bạn đã tham khảo. Cả mã nguồn và mã nhị phân cho mô-đun MDB đã có sẵn trong hơn một năm. Chúng được tích hợp vào SmartOS (http://smartos.org/), được tích hợp trên Đám mây công cộng Joyent và nguồn trên github (https://github.com/joyent/illumos-joyent/blob/master /usr/src/cmd/mdb/common/modules/v8/mdb_v8.c). –

3

2017 cập nhật: Bây giờ bạn có thể sử dụng giải pháp @ h-hellyer (llnode, dựa trên lldb thay vì mdb). https://stackoverflow.com/a/40045103/3221630

mdb + mdb_v8 là cách để thực hiện.

Để sử dụng mdb, bạn sẽ cần một hệ điều hành được hỗ trợ.

Hiện tại, rất có thể bạn sẽ chạy trên Linux. Nếu đây là trường hợp của bạn:

Phần 1. lấy kho cốt lõi của bạn

Bạn có thể tải kết xuất lõi của mình theo nhiều cách. Để có được bãi chứa lõi của bạn từ một quá trình đang chạy, bạn có thể làm điều này:

pgrep -lf node # get pids 
gdb -p your_pid 

# once in gdb.. 
gcore # this will output your core dump 
detach # this will allow the process to continue to run. 

Phần 2. sử dụng mdb

Có một cơ hội bạn biết về Solaris, OpenSolaris, IllumOS hoặc SmartOS. Nhiều khả năng đây không phải là trường hợp. Nếu bạn có thể đủ khả năng thời gian thiết lập SmartOS và mdb_v8, tốt.

Nếu không, hãy cài đặt VirtualBox, sau đó autopsy. Thao tác này xử lý nghi thức cài đặt SmartOS cũng như tải các tệp kết xuất lõi của bạn lên máy ảo.

Khi bạn đã hoàn tất và khi bạn đang ở trong phiên mdb, bạn có thể làm theo một số bước từ presentation này.

8

Trên Linux và Mac, bạn có thể sử dụng llnode một plugin cho trình gỡ lỗi lldb. Dự án được phát hành theo tổ chức nodejs trên github:

https://github.com/nodejs/llnode

Bạn có thể cài đặt từ nguồn qua github hoặc sử dụng bia trên Mac. Readme trên github sẽ giúp bạn có được nó được cài đặt và có một blog bài viết giới thiệu ở đây:

https://developer.ibm.com/node/2016/08/15/exploring-node-js-core-dumps-using-the-llnode-plugin-for-lldb/

Câu hỏi ban đầu là về phân tích bộ nhớ và v8 findjsobjectsv8 findjsinstances lệnh sẽ giúp có bằng cách tạo ra một biểu đồ cơ bản của đối tượng đếm và cho phép bạn liệt kê các trường hợp của từng loại.

Có một bài viết đầy đủ về việc sử dụng llnode để phân tích bộ nhớ ở đây: http://www.brendangregg.com/blog/2016-07-13/llnode-nodejs-memory-leak-analysis.html

+0

Thật tuyệt khi bây giờ điều này được hỗ trợ trên lldb, mà không cần phải sử dụng mdb. – arboreal84