2014-10-19 5 views
4

동료와 저는 node.js 애플리케이션을 작성했습니다. 이번 주에 문제를 디버깅하도록 지정되었습니다. 문제는 며칠마다 다음 오류로 인해 응용 프로그램이 충돌한다는 것입니다.node.js에서 'RangeError : Maximum call stack size exceeded'오류를 디버그하는 방법

events.js:0 
(function (exports, require, module, __filename, __dirname) { // Copyright Joy 
^ 
RangeError: Maximum call stack size exceeded 

불행히도 다른 것을 인쇄하지 않습니다.

이 문제를 디버깅하기 위해 node.js와 함께 사용할 수있는 node.js 방법과 도구는 무엇입니까? 우리의 응용 프로그램은 정말 크고 (전체 캠퍼스 문서 찾기에 도움이 됨)이 오류가 정확히 어디에서 발생하는지 알지 못합니다. (소스 코드의 파일이 많이 있습니다.)

+1

http://stackoverflow.com/questions/6095530/maximum-call-stack-size-exceeded-error – laggingreflex

+0

오류에서이 보인다 이벤트 이미 터는이 이벤트가 발생할 때 이벤트를 내 보냅니다. 즉, 이벤트가 자체적으로 트리거된다는 것을 의미합니다. 노드 검사기를 사용하여 디버그하십시오 – micnic

+0

아주 간단한 응용 프로그램에서 이전과 매우 비슷한 문제가있었습니다. 잘 기억하지 못하지만,'event.js '에 의해서도 발생했다고 생각합니다. 나는'process.on ('uncaughtException', ...)'을 설정했지만 오류가 발견되지 않았습니다. 나는 오류를 재현 할 수 있었지만, 적어도 (나에게는) 어떤 감각도 갖지 못했다. 나는 그것이'node.js' 외부 버그라고 생각 했으므로, 구 버전 (0.10.2x 대신 0.8.x)을 사용하기 시작한다. 오류가 사라졌습니다. 2 주 후 재부팅을 시도한 결과 0.10.2x를 다시 시도했습니다. 더 이상 오류는 없었습니다. 비록 내 코드가 이전과 완전히 동일했지만. –

답변

4

설명 (추측 할 수 있듯이, 며칠마다 (아마도 같은 시간이 지난 후에) 추측을 통해 시간이 지남에 따라 스택이 증가하는 스레드가있는 것처럼 들립니다. 이것을 보려면 하루 정도 기다렸다가 ProcDump을 사용하여 컨테이너 애플리케이션이 실제로 자바 스크립트를 실행하는 코어 덤프를 강제로 수행하십시오. WinDbg과 같은 코어 파일을 열고 우연한 스택 프레임 수를 가진 스레드를 찾으십시오. 그러면 문제가 해결됩니다.

+0

제안 해 주셔서 감사합니다. 나는 이것을 시도 할 것이다. – bodacydo

+0

어젯밤 집에가는 길에 자바 스크립트가 해석되지 않고 컴파일되지 않았기 때문에 이것이 작동하지 않을 것이라는 것을 깨달았습니다. 따라서 컨테이너를 실행하는 컨테이너에 내가 상상했던 스택 추적이 없어도 될 수 있습니다. 총 손실. 코어 덤프를 수집 한 후에 유틸리티 "strings"을 실행하여 덤프의 ASCII 문자열을 꺼내보십시오. 자바 스크립트 인터프리터는 인터프리터 된 라인의 복사본을 메모리에 가지고있을 것이고 재귀 적이라면 그 라인의 복사본이 많을 것입니다. 따라서 동일한 js 라인의 수천 개의 복사본을 찾으십시오. –

+0

안녕 랜디, 나는 아직 그것을 이해하지 못했지만 현상금을 당신에게 줄 것이다. 나와 함께 일하는 사람들은 당신의 방법을 사용하여 그것을 알아 내려고 노력할 것입니다. 감사. – bodacydo

2

공구가없는 경우 공구를 만드십시오.

function(...) { 
    callCounter[module]++; 
    console.log("module:",module,"count:",callCounter[module]); 
    ... 
    callCounter[module]--; 
} // fn() 

예, 그것은 화면 (편집 :를) 홍수 것입니다 : 당신은 값을 기준으로 함수 호출을 계산한다, 나는 당신이 함수 내에서 이런 식으로 뭔가를 삽입한다는 의미는 그래서 당신은 그것을 캡처 할 수 있습니다. (이 반 문장은 다시 추가 일 후, 어떻게 든 사라졌다.)