2024. 4. 10. 15:30

유니티에서  "Stack empty."에러가 발생하였습니다.

무조건 발생하는 건 아닌데 아주 가끔 에러가 납니다.

 

 

1. 원인을 찾자

처음에는 'enum'를 'switch'로 비교하는 곳에서 에러가 나서 아주 옛날에 있던 타입변환 버그를 의심했었습니다.

그런데 에러를 추적하다 보니 플레이메이커(Playmaker, FSM)의 함수를 호출하면 해당 에러가 나는 것을 발견하였습니다.

 

문제는 플레이메이커에서 나는 에러 잡는 방법을 몰라......

검색을 해도 나오질 않는 겁니다.

 

 

2. 해결 방법

결국 여러 번의 삽질을 하다가 어떤 상황인지는 모르겠지만 스레드 에러가 나는 것을 확인했습니다.

이 에러가 "Stack empty."에러와 연관있는지는 모르겠지만 일단 예외 처리가 필요할 것으로 보여서 메인 스레드에서 실행하도록 수정하였습니다.

(참고 : [Unity] 멀티 쓰레드 사용 시 UI가 업데이트되지 않는 오류 잡기 )

 

 

그랬더니 "Stack empty."에러가 사라졌습니다......

 

 

3. 오류의 의미

이 오류가 메인 스레드로 동작을 위임하면 발생하지 않는다는 전제라면

플레이메이커 쪽에서 동작한 특정 기능이 간헐적으로 메인 스레드에서 동작하지 않았다는 의미가 됩니다.

 

플레이메이커의 구조를 모르지만 대부분의 기능이 'MonoBehaviour.Update'에서 동작하도록 구현이 되어 있을 거 같은데 왜 메인 스레드에서 동작하지 않은 것인지 의문입니다.

 

어쩌면 플레이메이커를 호출하는 함수인 'Fsm.Event'가 스레드와 상관없이 호출된 스레드에서 동작하는 것일지도 모르겠네요.

근데 이렇다고 하기엔 다른 기능들도 'Fsm.Event'를 사용하고 있는데 유독 특정 부분에서만 이 에러가 발생했습니다.

안 그랬으면 'Fsm.Event'를 호출하는 코드를 모두 메인 스레드에서 호출해야 했겠죠.

 

일단은 해결이 됐으니 다행이지만 엄청 찝찝한 상황입니다.

 

 

마무리

서버에서 받은 데이터를 사용하다가 "Stack empty."에러가 났으니 당연히 데이터 해석하다가 문제가 발생한 줄 알고 한참을 삽질했는데....

엉뚱한 데서 나는 에러였다니 ㅎㅎㅎㅎ

 

이래서 개발자들이 자료가 많지 않은 외부 라이브러리 쓸 때 걱정하는 겁니다.

웃긴 건 플레이메이커는 나름 사용자가 많은 거로 알고 있는데도 검색하면 나오는 게 없어요 ㅋㅋㅋㅋㅋㅋ

어차피 제가 쓰는 것도 아니고 제가 쓸 이유도 없겠지만 이럴 때 보면 이게 정말 사용자가 많은 라이브러리가 맞나 싶습니다.