https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-sendmessage

 

SendMessage 함수(winuser.h) - Win32 apps

SendMessage 함수는 지정된 메시지를 창 또는 창으로 보냅니다. (SendMessage 함수)

learn.microsoft.com

SendMessage함수를 사용하게 되면 무한 대기 상태에 빠질 수 있다

SendMessage는 동기식으로 작동하기 때문에 윈도우로 메시지 보낸 다음에 응답을 받을 때 까지 대기한다.

HWND_BROADCAST로 윈도우 메시지를 보내면 어떤식으로 작동 하냐면, 

 

위에 msdn링크가 출처

모든 최상위 창으로 윈도우 메시지를 보내고, 응답이 올 때 까지 대기한다.

저렇게 되면 특정 윈도우 단 한개에서라도 응답을 주지 않으면, 프로그램은 무한 대기 하게 된다.

 

저런 경우에는 작업 관리자 - 대기 체인 분석으로 확인 가능하다.

 

다른 프로세스에서 응답을 못 받아 대기중이면 (프로세스이름)을 대기중입니다. 이런식으로 나온다.

 

아무튼 일반적으로는 모든 윈도우에서 응답받아서  정상적으로 실행되지만,

간혹 응답을 못 받는 경우가 있으니

 

HWND_BROADCAST 로 메시지를 보내야 할 때는 반드시 

SendMessageTimeout 으로 타임아웃을 지정해 주거나

비동기식인 PostMessage 를 사용해야한다

'C++, MFC > 트러블슈팅' 카테고리의 다른 글

Process Explorer 툴 활용하여 메모리릭 체크  (1) 2024.12.10

메모리 릭 이란?
- 응용 프로그램에서 메모리를 할당한 후 적절히 해제되지 않아 일어나는 현상
- 버그 발생 프로그램/ 운영체제의 성능 저하 및 심한 경우 프로그램이 강제 종료된다

체크 툴
Process Explorer
사용시 프로세스 목록이 뜸


체크할 프로세스를 선택하고 좌클릭 properites(속성) ->performance(성능) 선택


physical memory 칸의 working set,

virtual memory의 private bites 확인

(예시로 삼성노트의 속성을 확인해 보았다.)


해당 값들을 프로그램 동작 중에 체크 하며 어떤 동작에서 증가하는지 확인

- 해당 값들을 기록해 놓았다 프로그램 수정 전,후를 비교해도 도움이 된다.

 

Private Byte / Working Set 란

  Private Byte : 애플리케이션이 요청하는 메모리의 근사치

  Working Set: 프로세스가 현재 사용 중인 총 물리적 메모리

출처 : https://www.baeldung.com/cs/private-bytes-virtual-bytes-working-set

 

 

소스 코드 메모리 릭 관련 체크 사항

  메모리 할당 관련
  - malloc 으로 메모리 할당 시 free 로 해제 
  - new 로 동적 메모리 할당 시 delete[] 로 해제
  - CString GetBuffer() 로 문자열 버퍼 확보 후 ReleaseBuffer() 로 해제 등등..

  종료 함수
  프로그램 종료 함수 종류 :
    - PostQuitMessage()
    - TerminateProcess()
    - _exit(0)

    - ExitProcess(0)
ExitProcess(0) 가 가장 memory leak 가능성이 적다. 
함수마다 프로그램을 종료 시키는 시점이 다르니 동작을 확인해야 한다.

 

결과

개발중인 프로그램을 ProcessExplorer 프로그램을 통해 확인하고,

소스코드에서 memory leak 생길 만한 부분을 수정해서 다시 메모리 상태를 체크 해 보았다.

private bite, working set 모두 조금씩 감소한 것으로 확인된다.

 

+ Recent posts