아티클 관련 제품: TwinReader
들어가며
- TwinReader의 MGR POD는 node.js를 통해 back-end가 구성되어 있습니다.
- 예기치 않은 예외 상황이 발생하여 무한 루프와 같은 현상이 발생한다면 CPU를 100% 가까이 혹은 이상 점유하며 node.js 서버가 정상적인 작동을 하지 않을 수 있습니다.
- 이와 같은 CPU를 계속 점유하며 무한 루프 현상이 발생할 때 Debug 할 수 있는 방법을 알아보도록 하겠습니다.
Node debug 참고 사이트:
https://nodejs.org/en/docs/guides/debugging-getting-started/
https://nodejs.org/api/debugger.html#debugger
Debug을 위한 무한 루프 코드 작성 및 코드 실행
테스트를 위해 아래와 같이 단순한 무한 루프 코드를 $HOME 폴더 밑에 nodetest 폴더를 생성 후 main.js를 만들어 작성합니다.
mkdir ~/nodetest cd nodetest vi main.js
main.js 코드
let i=0; for(;;) { i++; }
Node 도커 컨테이너를 실행합니다.
docker run -itd --name nodetest -w /src -v ${HOME}/nodetest:/src node:14.17.3
docker exec 명령어를 이용하여 무한 루프 코드를 실행합니다.
docker exec -it nodetest node main.js
Node.js의 inspect 명령어를 이용하여 Debug
무한 루프 코드를 통해 debug 할 수 있는 환경을 만들었으며 node inspect를 통해 간단하게 debug 방법을 확인해 보겠습니다.
새로운 터미널을 오픈하여 docker exec 명령어를 통해 컨테이너에 접속합니다.
docker exec -it nodetest bash
ps -ef 명령어를 통해 node 프로세스의 ID를 확인합니다.
ps -ef | grep main.js
확인한 PID를 이용하여 Node.js debug 모드를 활성화 합니다.
kill -s SIGUSR1 [PID]
node inspect 명령어를 통해 debug 모드로 진입합니다.
node inspect -p [PID]
Debug 모드에서 pause 명령어를 입력합니다.
debug> pause
pause 명령어를 입력 할 경우 breakpoint 가 생성 되며 현재 무한 루프가 발생한 부분을 확인 할 수 있습니다.
break in main.js:3 1 let i=0; 2 > 3 for(;;) { 4 i++; 5 }
다음 스텝으로 이동해야 할 경우 n 혹은 next를 입력합니다. pause 상태에서 계속 실행을 해야할 경우 c 혹은 cont를 입력합니다. cont, c: Continue execution next, n: Step next
변수 값을 확인하고 싶을 경우 exec('변수명') 혹은 repl를 이용하여 변수 값을 확인할 수 있습니다.
exec 명령어를 이용하여 i의 변수 값 확인
debug> exec('i')
repl 명령어를 이용하여 i 변수 값 확인
debug> repl Press Ctrl + C to leave debug repl > i
마무리
- Node.js 컨테이너의 debug 방법을 알아 보았습니다.
- 특정 위치의 정보를 확인해야할 경우 setBreakpoint() 함수를 이용하여 확인도 가능합니다.
- 필요할 경우 사이트를 참고해 보세요 https://nodejs.org/api/debugger.html#breakpoints
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.