반응형

C/C++로 작성한 어플리케이션에서 발생하는 에러중 가장 골치 아픈 에러가 메모리 에러가 아닌가 싶다.( 물론 deadlock이라던가 이런 문제들도 간단친 않지만... )

보통 몇년간 프로그래밍을 하다보면 malloc 혹은 free()를 호출할때(당연히 new/delete도 마찬가지다) 쌩뚱맞게도 메모리 에러가 발생하는 케이스를 경험하게 된다
.

처음 이 에러를 접했을때는 '대략난감'이랄까
?
하지만 대부분은 '내 잘못'인 에러 케이스다
.

이 현상의 대부분은 malloc을 통해 할당받은 메모리의 범위를 넘어서서 데이터를 복사하거나, 이중으로 free를 호출할때 발생한다.

(이 문제는 Windows의 메모리 관리 방법과 밀접한 관계가 있으며, 상기 동작으로 인해 Memory Block의 정보를 담고 있는 Description(?) 영역을 Overwirte해서 발생할 수 있다.- 그림과 함께 좀더 상세한 내용을 기술 하고 싶지만, 아직 내공이 부족해서 ㅡ.: 머지 않은 미래에 Study해서 Posting해보려 한다)

예를 들어.

char *p = (char *)malloc(10);
memcpy( p, p2, 11);

char *p = (char *)malloc(10);
free
(p);
.
.
.
free(p);

< * free한 메모리에 대해 NULL을 할당하는 것도 좋은 코딩 습관이다. NULL 포인터에 대한 free연산은 적법(?)하다>


이런 경우 코드가 포함되어 있다면, 불특정한 순간에 malloc하거나 free 할때 메모리 에러로 인해 어플이 종료되거나 드라이버의 경우 BSOD를 만나게 된다.
(
물론 위와 같이 눈에 띄게 코딩되어 있진 않을꺼라 장담한다 ㅡㅡ
)

운이 좋다면 문제 발생 지점의 전후를 살펴보면 문제를 확인 할 수도 있겠지만
,
세상일이 어디 그리 만만 하던가
?

1. Applicaton Verifier
gflags를 통해 도움을 받거나,

2. 문제가 발생한 메모리 블록을 추적해서 문제 지점을 유추하거나
3.
그것 마저 여의치 않다면 할당, 해제, 할당한 메모리에 대해 복사하는 코드들에 대한 꼼꼼한 체크가 필요하다.

 

반응형

+ Recent posts