임베디드 용어 사전
디버깅

스택 오버플로

스택이 할당된 범위를 넘어 다른 메모리를 덮는 상황. 증상이 원인과 멀어 찾기 어렵다.

임베디드에서 가장 찾기 어려운 버그 유형에 속한다.

왜 어렵나

스택이 넘치면 옆에 있는 전역 변수나 다른 태스크의 스택을 덮는다. 증상은 전혀 관계없어 보이는 곳에서 나타난다 — 변수 값이 이상해지거나, 나중에 폴트가 난다.

원인

큰 지역 배열          uint8_t buf[2048]; 를 함수 안에 두면 스택에서 나간다
재귀                 깊이를 예측할 수 없다
인터럽트 중첩         ISR 도 같은 스택을 쓴다 (MSP)
RTOS 태스크 스택 부족  태스크마다 따로 잡아야 한다
printf 계열          내부에서 스택을 크게 쓴다

미리 잡는 방법

워터마크        스택 영역을 0xAA 같은 패턴으로 채워 두고, 얼마나 덮였는지 주기적으로 확인
MPU 가드        스택 끝에 접근 금지 영역을 두면 넘는 순간 MemManage 폴트로 잡힌다
링커 심볼 검사   현재 SP 가 스택 하한보다 낮아졌는지 확인
정적 분석       호출 그래프로 최대 스택 사용량을 계산하는 도구가 있다

MPU 가드가 가장 확실하다 — 조용히 덮는 대신 즉시 폴트로 만든다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 폴트 해독 — HardFault 에서 원인을 찾아내기