힙 내에 할당된 각 메모리 블록은 할당 함수에 의해 리턴되는 주소에서 시작되는 데이터 영역과, 메모리의 할당을 해제할 때 메모리 관리 함수가 메모리 공간을 제대로 확보하는 데 필요한 데이터 영역에 인접해 있는 제어 영역으로 구성되어 있습니다. 힙에서 제어 구조를 겹쳐쓰면(예를 들어, 할당된 배열 경계 외부에 있는 요소에 작성하거나 할당된 메모리 중에서 너무 작은 블록에 문자열을 복사하여 겹쳐쓰는 경우) 제어 정보가 손상되어 다른 할당된 블록을 겹쳐쓰지 않았더라도 프로그램 동작이 잘못될 수도 있습니다.
힙 오류를 찾으려면 다음 사항을 고려하십시오.
프로그램을 컴파일하여 메모리 관리 함수의 힙 검사 버전을 사용하여 힙 오류를 찾을 수 있습니다(-qheapdebug 컴파일러 옵션에 대한 정보는 관련 디버그 컴파일러 옵션 주제 참조). 이 옵션으로 컴파일된 프로그램을 실행하면 메모리 관리 함수의 각 호출로 인해 기본 힙에서 힙 검사가 수행됩니다. 이 힙 검사는 힙 내에 할당된 각 메모리 블록의 제어 구조를 검사하여 겹쳐쓰기된 제어 구조가 없는지 확인합니다. 오류가 발생하면 프로그램이 종료되고 힙 손상이 발생한 주소, 마지막으로 올바른 힙 상태가 발견된 소스 파일과 행 번호, 메모리 오류가 발견된 소스 파일과 행 번호를 비롯한 정보가 표준 오류에 작성됩니다.
힙 검사는 각 실행 파일에 사용되는 기본 힙에만 사용할 수 있습니다. 메모리 관리 함수의 디버그 버전이 힙 손상을 보고하지 않지만 문제점이 의심되는 경우 별도의 힙을 사용 중이거나 힙 손상이 발생했을 수 있습니다.
오류를 발생시키는 힙이 기본 힙일 경우, 올바른 힙의 마지막 행과 손상이 발생한 첫 번째 행 사이의 간격을 점차 좁혀 디버거 내부에서 힙 오류가 발생한 원인을 파악할 수 있습니다. run 명령, step 명령, 행 및 함수 중단점, 중지 시 힙 검사 수행 설정을 조합하여 검색 범위를 좁히십시오. 이 설정에 대한 정보는 관련 항목을 참조하십시오.
의미 구조적으로 올바르지 않은 프로그램의 경우, 중지 시 힙 검사 수행으로 인해 프로그램이 스택에서 데이터에 잘못 액세스하는 결과를 초래할 수 있습니다. 이는 중지 시 힙 검사 수행으로 인해 디버그할 프로세스 및 스레드가 실행이 중지될 때마다 힙 검사 함수를 호출하고 이 힙 검사 함수는 스택 프레임으로 해당 영역의 일부를 겹쳐쓰기하여 스택의 안전한 영역에 영향을 주기 때문입니다. 예를 들어, 호출된 함수가 로컬 변수의 주소를 리턴하면 호출 함수에서 해당 로컬 변수의 컨텐츠에 액세스할 수 있으며 호출된 함수에 사용되는 스택 프레임을 후속 호출로 겹쳐쓰지 않는 한 변경할 수 없습니다. 하지만, 중지 시 힙 검사 수행을 사용할 때 호출 함수에서 단계별 리턴을 실행하면 호출 함수에서 리턴 시 힙 검사 함수를 즉시 호출하고 리턴된 포인터가 지시하는 메모리를 힙 검사 함수의 스택 프레임이 겹쳐쓸 수 있습니다.
디버거 내에서의 힙 검사는 각 단계 이후에 힙이 검사되므로 step 명령에 대해 비용이 많이 듭니다. 대규모 코드 섹션을 스테핑하거나 중단점에서 자주 중지하는 경우 디버그 성능이 저하되므로 힙 오류가 발생되는 것으로 의심되는 영역에서만 중지 시 힙 검사 수행을 설정해 보십시오.