2012-01-02 4 views
15

gcore를 사용하여 Node.js 프로세스의 코드 덤프를 만들면이를 분석 할 수있는 가장 좋은 도구는 무엇입니까? Node.js의 코어 덤프 분석 도구

에 의해 영감 : 내 특정 경우 Tool for analyzing java core dump

, 나는 약간의 메모리 누수를 조사에 관심이 있어요, 그래서 일부 힙 분석을 얻을 정말 궁금 하군요. 일반 도구 및 계측 패키지 및 기술도 환영합니다. Node.js가 매우 흥미롭지 만 런타임 분석 도구는 아직 존재하지 않습니다.

답변

16

충돌을 조사하기 위해 node-segfault-handler을 매우 유용하게 사용했습니다. SIGSEGV에 이르는 NULL의 deref와 같은 신호로 하드 크래시가 발생했을 때 네이티브 코드 스택 추적을 얻기 위해 조리 한 모듈입니다.

메모리/할당 문제를 조사하려면 다음을 참조하십시오. 지금까지 수집 한 내용 :

1) Blog post by Dave Patheco - 저자는 JS 스택 등을 얻기 위해 MDB에 플러그인을 사용하는 방법에 대해 이야기합니다. 슬프게도, 내가 알 수있는 한, 그 플러그인의 소스는 결코 공개되지 않았다 (어떤 바이너리 형식도).

2) Postmortem Debugging in Dynamic Environments - Dave Patheco가 작성한 ACM 대기열 기사 (블로그 게시물에서 링크 됨). 그것이 훌륭한 배경 읽기를 만드는 동안, 기사에는 많은 구체적인 도구와 기술이 없습니다.

3) node-panic - 어설 션 오류 유형 충돌시 덤프 상태를 나타내는 pure-JS 도구입니다. 네이티브 코드 오류 (SIGSEGV 등)에서 비롯된 크래시 디버그에 도움이되지 않습니다.

4) Joyent: Debugging Production Systems - Bryan Cantrill이 권장하는 도구 및 기술 (thx crickeys)에 대한 의견.

+1

이 (http://www.infoq.com/presentations/Debugging-Production-Systems) :

여기에 메모리 분석을 위해 llnode 사용에 대한 전체 기사가있다. 코어 파일에서 mdb를 사용할 수 있도록 joyent에서 smartos를 실행해야한다고 생각하지만 실제로는 잘 모르겠습니다. – crickeys

+0

참고를 보내 주셔서 감사합니다. MDB 모듈의 소스 코드와 바이너리 모두 1 년 이상 사용할 수 있습니다. Joyent Public Cloud에 내장 된 SmartOS (http://smartos.org/)에 내장되어 있으며 소스는 github (https://github.com/joyent/illumos-joyent/blob/master)에 있습니다. /usr/src/cmd/mdb/common/modules/v8/mdb_v8.c). –

3

201 업데이트 : 이제 @ h-hellyer 솔루션 (lldnode, mld보다는 lldb 기반)을 사용할 수 있습니다. https://stackoverflow.com/a/40045103/3221630

mdb + mdb_v8이 최선의 방법입니다.

mdb를 사용하려면 지원되는 OS가 필요합니다.

이제 Linux에서 실행될 가능성이 큽니다. 이 사건의 경우 :

1 부 핵심은

당신은 여러 가지 방법으로 코어 덤프를 얻을 수 있습니다 덤프 얻을. 은 당신이 할 수있는 실행중인 프로세스에서 코어 덤프를 얻으려면 :

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. 

2 부 사용 MDB는 솔라리스, 오픈 솔라리스, IllumOS 또는 SmartOS에 대해 알고있는 기회가있다

. 대부분의 경우에는 그렇지 않습니다. SmartOS 및 mdb_v8을 설정할 시간이 있으면 괜찮습니다.

그렇지 않으면 VirtualBox를 설치 한 다음 autopsy을 설치하십시오. 이것은 SmartOS를 설치하고 코어 덤프 파일을 VM에 업로드하는 의식을 처리합니다.

일단 완료되면 mdb 세션에있을 때이 presentation의 단계 중 일부를 수행 할 수 있습니다.

8

Linux 및 Mac의 경우 lldb 디버거 용 플러그인 llnode를 사용할 수 있습니다. 이 프로젝트는 GitHub의에 nodejs 조직에서 볼 수 있습니다 : 당신은 GitHub의를 통해 소스에서 설치 또는 Mac에서 양조를 사용할 수 있습니다

https://github.com/nodejs/llnode

. GitHub의에 대한 추가 정보는 당신이 그것을 설치 얻을 수 있도록해야하며, 여기에 소개 블로그 기사있다 :

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

원래 질문은 메모리 분석에 대해이었고, v8 findjsobjectsv8 findjsinstances 명령은 객체의 기본 히스토그램을 생성하여이 도움이 될 것입니다은 각 유형의 인스턴스를 나열 할 수 있습니다. 그냥 지켜 http://www.brendangregg.com/blog/2016-07-13/llnode-nodejs-memory-leak-analysis.html

+0

이제는 mdb를 사용하지 않고 lldb에서 지원됩니다. – arboreal84