디버깅

[C/C++] Memory 쓰레기 값에 따라 할당과정 추측하기

Mesia 2016. 11. 25. 17:31
[출처] http://daramzz.blogspot.kr/2015/09/vector.html

- assert로 예외처리 하기
    assert(조건식); //assert 내부의 조건식이 거짓이면 abort시킨다. #include <assert.h>필요
- memcpy, memmove함수 사용
    memcpy와 memmove함수는 공통적으로 목표한메모리로 메모리를 옮겨준다. 하지만 memcpy는 바로 메모리를 옮기지만 memmove는 임시공간에 복사후 옮긴다. 이렇게 하면 안정성이 보장되서 목적지와 원본지가 같을경우 memmove가 사용된다.
- 쓰레기값
    0xcccccccc : 초기화 되지 않은 지역변수
    0xcdcdcdcd : 초기화되지 않은 힙에 할당된 메모리
    0xdddddddd : 힙에서 free된 메모리
    0xfeeefeee : 힙에서 free된 메모리
    0xfdfdfdfd : 힙에 할당된 메모리의 초과범위(할당된 메모리의 양쪽 끝)
    디버그 모드에서는 쓰레기값을 채워야 하지만 release모드에서는 쓰레기값을 채우지 않는다.
- debug 모드, release 모드
    debug모드는 내 코드를 그대로 컴파일 하지만 release모드는 컴파일시 최적화 과정을 거친다. 개발시에는 debug모드를 배포를 할때는 release모드를 사용해야 한다.
- long에 관해서
    int는 4byte 정수자료형, long은 4byte 정수자료형으로 같아보이지만 만약 64bit 계산체계가 개발되어 포인터가 8byte로 증가하게 되면 int는 여전히 4byte여서 포인터를 int로 casting하는 코드는 버그가 생길수 있다. long은 8byte로 포인터와 같게 증가하기 때문에 포인터를 정수로 바꿔서 연산할 경우 long을 사용해야 한다.