CE 네트웍문제 해결. 원인은 메모리 누수. Windows CE



7인치 LCD키패드에 CE 어플을 넣었습니다.
잘되던 네트웍이 10 수시간만 되면, 끊어져 버리더군요.

문제는, 항상 원격제어가 가능하도록 해야 하기 때문에, 이렇게 납품을 하게되면 상당히 난처한 상황이었습니다.


아니 잘되던 네트웍이 왜 갑자기 맛이 가는걸까...
이 에러를 잡기위해 보름 이상의 시간이 들어간 것 같네요.
TEST를 한번해보는 데에 최소 10시간 정도가 소요되니, 돌아버릴뻔 했습니다.


처음부터 본인이 개발한 제품도 아니고, 인수인계 받은 상황에서 느닷없이 터지는 버그란,
지루한 디버깅만을 초래할 뿐...

A : 1,2,3,4,5의 기능이 되고, 여기에 추가될 기능은 6,7,8이다.
코즈 : 네 알겠습니다.
         1,2,3,4,5 + 6,7,8 개발 완료

TEST 시작 : 버그 버그 버그 버그 버그 버거느거벅머금검ㄱ
 -ㅅ-)


우선 냉정하게 어느부분이 문제가 있었던 것인지, 따져보는 것이 중요하겠지요.

VS에서 에러 수준을 높여줍니다.
디버그 - 예외 (Ctrl Alt E)
Win32 Exceptions에서 Datatype misalignment, Access violation, illegal instruction등을 체크하여 throw되도록 합니다.
에러 체크 수준이 높아졌으므로, 예외로 스킵되던 것들도 걸러집니다.

몇 개 보이는군요.

수정 후 다시 TEST
또 죽습니다.

왜 죽지... -ㅅ-)
10시간이 넘어가면 프로그램이 이상하게 느려지거나 버벅거리는 현상이 납니다.

-ㅅ-)음... 뭔가 쌓이는군.
메모리 쪽이 영 불안해보입니다.

한참을 헤매어 수정을 한 결과, Client로 부터 패킷을 받고 Accept할 때 마다, 객체를 생성하는 놀라운 광경을 목격합니다..

아무리 급하게 짰어도.. delete는 해줄것이지... ㅠ.ㅠ
말하고 싶어도 이미 회사엔 없는 그분...

수정 후 다시 TEST.. 이젠 되겠지
또 DIE..

안되겠다... 소스의 모든 new를 점검

헐러러럭얽어허어거
delete는 몇개없는데 new는 왜이리 많은지..

결국 모든 new를 찾아서 해제를 어떻게 해줬는지 확인을 해야했고,
그 과정에서 필요한 부분에 대해서는 패턴을 써가며, 거의 리팩토링 수준이 되었네요.

메모리를 할당하고 제대로 해제하지 않아서, 언뜻보면 네트웍의 문제가 생긴 것으로 오해할 수 있었는데요
미리 예상메모리를 알지못해서 동적으로 할당을 해야 할 메모리라면, 정말 신중하게 작업해야 합니다.
현업에서 쓰이는 소스라고 해서 안심하고 인수인계 받고 할 일이 아니라는 걸 느꼈습니다.

개발경력 몇년차인 개발자라 하더라도, 이런 문제는 습관인 것 같습니다.
다이얼로그를 해제할 때에는 메모리만 delete해서는 안되고,
배열로 잡힌 메모리해제를 할 때에는 단순 delete가 아닌 delete[]를 쓴다는 것은 기본적인 내용임에도 불구하고,
자칫 빠뜨리거나, 모르는 분들이 계신 것 같습니다.

또, 버퍼 오버런 에러가 뜨는 경우도 많았는데, 이 부분은 strcpy() 함수가 원인이었습니다.
가급적이면 방어적인 코드를 작성해야 함에도 불구하고, 일정에 쫓겨서인지는 모르겠으나,
많은 곳에서 안전하지 못한 함수들이 사용되고 있더군요.


단순 몇 바이트의 메모리 누수가 몇시간 몇일이 지난 후 그 제품에 끼치는 영향은
'나비효과'라고 표현해도 되지 않을까요.

덧글

  • 몽몽이 2009/11/28 18:45 # 답글

    그런 버그들을 자기 수명 연장의 노하우라고 자랑스럽게 주장하는 치들이 꽤 있죠.
    사형제도가 폐지되면 안되는 이유입니다. 가끔은 연좌제 생각이 날 때도.
  • 코즈 2009/11/30 08:26 #

    사형..인거군요.. ㄷㄷㄷ
댓글 입력 영역


Post-it