[TIL] Missing Semester #4: Debugging & Profiling

2026. 04. 11.Yeji Kim
missing-semester

Claude와 함께 MIT Missing Semester 강의를 실습하며 정리한 내용입니다.

들어가며

이번 강의는 문제를 찾고 성능을 측정하는 도구들을 다룬다. (디버거, 프로파일러)

핵심 개념

디버깅 단계별 도구

1단계: Printf 디버깅 - console.log, print, echo 찍어보기. 가장 단순하고 가장 많이 쓰는 방법.

2단계: 로깅 - severity level로 중요도 구분:

  • DEBUG - 개발 중 상세 정보
  • INFO - 정상 동작 기록
  • WARN - 잠재적 문제
  • ERROR - 실제 에러

프론트엔드의 console.log / console.warn / console.error 구분과 동일한 원리.

3단계: 디버거 - 코드를 한 줄씩 실행하면서 변수 상태 확인. gdb/lldb(C/C++), pdb(Python), Chrome DevTools(JavaScript). VS Code에서 빨간 점 찍고 F5 누르는 게 이것.

핵심 명령어 (대부분의 디버거 공통): breakpoint(멈추기), step(한 줄 실행), next(함수 안으로 안 들어감), print(변수 확인), backtrace(호출 스택).

4단계: 시스템 콜 추적 - 프로그램이 OS에 뭘 요청하는지 확인. strace(Linux), dtrace(macOS).

프로파일링

"느린데 어디가 느린지 모르겠을 때" 쓰는 도구.

time 명령어

bash
time npm run build
  • real - 실제 경과 시간 (벽시계)
  • user - CPU가 사용자 코드에 쓴 시간
  • sys - CPU가 커널(OS)에 쓴 시간

real이 크고 user가 작으면 I/O 대기(네트워크, 디스크)가 병목. user가 크면 CPU 연산이 병목.

리소스 모니터링

  • htop - CPU/메모리 실시간 모니터링
  • du -sh * - 디렉토리별 디스크 사용량
  • df -h - 전체 디스크 여유 공간
  • lsof - 열린 파일/포트 확인
  • lsof -i :3000 - 3000번 포트를 쓰고 있는 프로세스 찾기

벤치마킹: hyperfine

bash
hyperfine 'command1' 'command2'

여러 번 측정해서 평균/표준편차로 비교. 최적화 전후 before/after 비교에 유용.

Flame Graph

함수 호출 스택을 시각화. 넓은 막대 = 오래 걸리는 함수. 병목 지점을 한눈에 파악 가능.

실습 기록

블로그 빌드 시간 측정

time npm run build로 빌드 시간의 real/user/sys를 확인.

htop + du

htop으로 실시간 리소스 확인. du -sh */ | sort -rn | head -5로 블로그 폴더별 디스크 사용량 확인.

hyperfine 벤치마킹

hyperfine 'npm run build'로 빌드 시간을 통계적으로 측정.

lsof 포트 확인

lsof -i :3000으로 개발 서버가 사용 중인 포트 확인. "포트가 이미 사용 중입니다" 에러 날 때 범인 찾는 명령어.


레퍼런스