본문 바로가기
개발이야기

WinCE 프로그램 종료와 Exception 'User Stack Overflow' 오류

by 코저씨 2021. 7. 22.
728x90

MFC 프로그램 종료

 

윈도우 CE를 사용하는 PDA 프로그램을 개발할 때 있었던 일이다.

 

프로그램이 실행되면 메인 함수가 쓰레드로 실행되고 있고, 메인 함수가 종료되면

 

SendMessage 함수로 WM_CLOSE 메시지르 보내 종료를 시켰었다.

 

따로 화면에 에러 메시지도 안나오고, 다시 프로그램을 실행해도 문제가 없어

 

그냥 넘어갔는데, 간헐적으로 제어판이나 PDA가 멈추는 증상이 나왔다.

 

이상해서 커널 메시지를 확인하니...

 

 

커널 메시지

Exception 'User Stack Overflow' (0xfffffffd): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=400222e0(coredll.dll+0x000122e0) RA=400a4760(coredll.dll+0x00094760) SP=00431ff8, BVA=00431ffc
Exception 'Raised Exception' (0x116): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=00400002(pprc=8526d5e0) 'NK.EXE', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=eff5ed8c(k.coredll.dll+0x0001ed8c) RA=81027648(kernel.dll+0x0000e648) SP=ae7cedfc, BVA=ffffffff
Exception 'Data Abort' (0x4): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=400372b0(coredll.dll+0x000272b0) RA=00530000(???+0x00530000) SP=0052f554, BVA=38000018
Exception 'Raised Exception' (0xc0008002): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=4002b544(coredll.dll+0x0001b544) RA=81027648(kernel.dll+0x0000e648) SP=0052f564, BVA=38000279
Exception 'Data Abort' (0x4): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=400372b0(coredll.dll+0x000272b0) RA=00530000(???+0x00530000) SP=0052f554, BVA=38000018
Exception 'Raised Exception' (0xc0008002): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=4002b544(coredll.dll+0x0001b544) RA=81027648(kernel.dll+0x0000e648) SP=0052f564, BVA=3800027a
Exception 'Data Abort' (0x4): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=400372b0(coredll.dll+0x000272b0) RA=00530000(???+0x00530000) SP=0052f554, BVA=38000018
Exception 'Raised Exception' (0xc0008002): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=4002b544(coredll.dll+0x0001b544) RA=81027648(kernel.dll+0x0000e648) SP=0052f564, BVA=3800027b
Exception 'Data Abort' (0x4): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=400372b0(coredll.dll+0x000272b0) RA=00530000(???+0x00530000) SP=0052f554, BVA=38000018
Exception 'Raised Exception' (0xc0008002): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=4002b544(coredll.dll+0x0001b544) RA=81027648(kernel.dll+0x0000e648) SP=0052f564, BVA=38000274
Exception 'Data Abort' (0x4): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=400372b0(coredll.dll+0x000272b0) RA=00530000(???+0x00530000) SP=0052f554, BVA=38000018
Exception 'Raised Exception' (0xc0008002): Thread-Id=0635001e(pth=9b8bb2d0), Proc-Id=0630001e(pprc=9b88e31c) '내프로그램.exe', VM-active=0630001e(pprc=9b88e31c) '내프로그램.exe'
PC=4002b544(coredll.dll+0x0001b544) RA=81027648(kernel.dll+0x0000e648) SP=0052f564, BVA=38000275

내 프로그램이 종료될때, 유저 스택 오버플로우와 Exception 에러들이 나오고 있었다. 

메모리 free 이슈나 메모리 부족인 줄 알고 유저 스택을 크게 키워 봤지만 해결은 되지 않았다.

 

WM_CLOSE와 WM_DESTROY 차이 

처음에는 send_message로 WM_CLOSE를 써서 종료를 했는데,

이는 윈도우의 닫기 버튼을 눌렀을 때와 같은 이벤트를 발생한다고 한다. 즉, 프로그램이 종료된다라는 메시지만 날리지

실제 메모리 초기화 등 종료에 대한 준비는 안 하며

 

WM_DESTROY 는 실제 프로그램이 종료될 때의 이벤트와 같으며, DestroyWindow함수를 호출해서 사용된 메모리를

반환한다.

 

그래서 WM_DESTROY 이벤트로 종료하게 하니, 유저 스택 오버플로우와 Exception 에러가 사라졌다.

 

 
 

항상 함수든 프로그램을 종료할 때는 메모리 반환에 주의하자.

 

 

 

728x90