2011-10-05 6 views
23

가 나는 다음과 같은 출력과 죽음을 일으킬 수있는 서버를했다 "최대 호출 스택의 크기 초과" 문제 함수가있는 곳은 말할 것도없고, 무한 재귀 또는 단지 약간 큰 체인입니다.디버깅

노드를 실행하여 --trace 옵션을 사용하면 내 테스트가 느려질뿐 아니라 문제가 재현되지 않았습니다.

아무도이 문제를 해결하기위한 솔루션이나 팁이 있습니까?

+0

이는 고집, 일이 알려진 후 새로운/변경된'emit' 호출마다 여분의 로그를 남기고''드레인 ''이벤트 - 즉 속도 감응에 대한 공동 재귀를 유도하는 범위 지정 오류를 발견합니다. 나는이 문제를 해결할 수있는 최선의 일반적인 전략에 대한 답을 받아 들일 것입니다. – OrangeDog

답변

9

대답은 현재 것 같다.

This archived thread from the v8-dev mailing list

  • 데이브 스미스가 크롬 프로젝트의
  • 양 Guo 그것을 설명하는 패치를 바로이 문제를 제공하고 제안하는 토론을 보여줍니다 문제에 대한 크롬 버그를 파일 및 적용 다른 수정
  • Dave는 노드 (당시 0.8)가 V8 3.11을 사용 중이며 패치를 백 포트하는 것에 대해 묻습니다. 양은 패치가 V8 3.15에 도착할 것이고 백 포트되지 않을 것이라고 대답했다.

Node.js v0.8은 V8 3.11을 사용했습니다. Node.js 0.10은 현재 V8 3.14를 사용 중입니다. 따라서 Chromium이이 문제에 대해 수락 한 패치는 노드가 관련 될 때까지 여전히 "미래"입니다.

(그것이 내가이 모든 것을 배운 그의 대답에서 스레드를 따라 이후이 대답은 @Coderoshi 덕분에 빚지고있다.)이 특별한 문제는 이전과 차이점을 비교하여 해결되었습니다

+0

이것에 대한 뉴스? "RangeError : 최대 호출 스택 크기를 초과했습니다."디버깅 할 같은 문제가 있습니다. 문제는 며칠 동안 변경되지 않은 웹 응용 프로그램에서 발생하며 검색 방법을 모르기 때문에 스택 추적이 큰 도움이된다는 것입니다. –

+0

노드 0.11은이 상황에서 스택 추적을 표시하기 위해 새로운 버전의 V8을 사용합니다. 노드 0.11에서 웹 애플리케이션을 실행할 수 있다면 시도해보십시오. – metamatt

+1

웹 응용 프로그램을 실행할 수 있었지만 v.0.11.6을 시도했지만 스택 추적이 작동하지 않았습니다. 어쨌든 나는 버그를 고쳤지만이 주석은 스택 추적을 찾는 유사한 버그를 가진 사람들에게 유용 할 수 있다고 생각했다. 어쩌면 불안정한 버전을 컴파일하지 않고 누군가 시간을 절약 할 수도 있습니다. –

4

"약간 너무 큰 체인"이 될 가능성은 거의 없습니다.

그것은 아마도 자체를 트리거 한 이벤트를 호출하는 함수입니다.

그래서 코드 속도가 느려지면 무한 재귀가 중지됩니다. 내 생각 엔 대기열이 있고 느린 모드로는 이 빠르지 않을 것입니다.

이것이 도움이되지 않는다면 나는 더 많은 정보가 필요하다고 생각합니다. 어쩌면 누군가가이 모든 것을 포착 할 수 있습니다.

2

이 패치는 솔루션을 찾는 데 도움이됩니다. 그것은 대단히 스택 추적을 확장 : 꽉 앉아 Node.js를이 새로운 V8 버전으로 업데이트하거나, the patch from this Chromium project bug report 사용하여 자신을 구축 할 때까지 기다립니다 :

https://github.com/dizzyd/node/commit/40434019540ffc17e984ff0653500a3c5db87deb

+0

이것은 올바른 접근 방식처럼 보입니다. 나는이 패치를 "스택 트레이스를 엄청나게 확장"한다고 설명하지는 않을 것입니다. 나는 "스택 오버 플로우 예외에 대한 스택 추적을 구성하는 것이 훨씬 더 힘들다"고 설명합니다.BTW,이 패치로 수정 된 코드는 TODO (1240995)에 대한 참조를 포함합니다. 누구든지 어떤 버그 데이터베이스를 알고 있는지 알고 있습니까? – metamatt

+0

버그 1240995를 찾지 못했지만 dizzyd의 패치가 된 것을 찾았습니다. http://stackoverflow.com/a/15664576/275581을 참조하십시오. – metamatt