문제

GDB에서 C ++ 프로그램을 실행하고 있습니다. 나는 GDB에 대한 경험이 없지만 다음과 같은 메시지를 받고 있습니다.

warning: HEAP[test.exe]:
warning: Heap block at 064EA560 modified at 064EA569 past requested size of 1

이 일이 일어나는 곳을 어떻게 추적 할 수 있습니까? 기억을 보는 것은 단서를 제공하지 않습니다.

감사!

도움이 되었습니까?

해결책

그래서 당신은 당신의 힙을 파열하고 있습니다. 여기 좋은 일이 있습니다 GDB 튜토리얼 유의 사항.

저의 정상적인 관행은 코드의 잘 알려진 좋은 부분에서 휴식을 취하는 것입니다. 일단 당신이 오류가 나올 때까지 단계를 통과하십시오. 일반적으로 그런 식으로 문제를 결정할 수 있습니다.

힙 오류가 발생하기 때문에 힙에 넣는 것과 관련이 있다고 가정하므로 변수에 특별한주의를 기울여야합니다 (GDB로 인쇄하여 메모리 주소를 결정할 수 있다고 생각합니다. 오류가 발생하는 곳과 동기화). 또한 기능을 입력하고 기능에서 돌아 오는 것은 힙과 함께 플레이하여 문제가있는 곳이 될 수 있음을 기억해야합니다 (특히 기능에서 돌아 오기 전에 힙을 엉망으로 만들면).

다른 팁

"시계 포인트"라는 기능을 사용할 수 있습니다. 이것은 브레이크 포인트와 같지만 메모리가 수정되면 디버거가 중지됩니다.

나는 이것을 사용하는 방법에 대한 대략적인 아이디어를 주었다. 대답 다른 질문에.

다른 도구를 사용할 수 있다면 시험해 보는 것이 좋습니다. Valgrind. 계측 프레임 워크로 코드를 실행할 수있는 방식으로 코드를 실행할 수 있습니다. 일반적으로 오류를 일으키는 정확한 명령어에서 중지 할 수 있습니다. 이런 식으로 힙 오류는 일반적으로 쉽게 찾을 수 있습니다.

Maloc_check_ envronment 변수 구성 (MAN LIBC)과 함께 표준 LIBC와 동일한 종류이므로 시도 할 수있는 한 가지.

GDB를 종료하지 않는 경우 (응용 프로그램이 종료 된 경우 "r"을 사용하여 다시 실행할 경우) 해당 주소 "HBREAK 0x64EA569"에서 메모리 중단 점을 설정할 수 있습니다. BreakPoitn이 중단 점을 과도하게 입력하는 것을 방지하기위한 옵션을 활성화/비활성화합니다 ....

로그 파일을 구성하고 로그를 설정할 수 있습니다 ... 매번 "display/bt -4"에 스택 추적을 설정 한 다음 r을 누른 다음 Enter 키를 누르고 "또는 C #을 사용하십시오. # X Times ... 등을 계속하려면 ... ", 결국 같은 주장을 보게 될 것입니다. 이제 (디스플레이/bt로 인해) 스택 트레이스를 가질 것입니다.이 주소에서 어떤 코드를 수정했는지에 따라 .

나는 구조물에 대한 포인터 배열을 재 할당하려고 할 때 비슷한 문제가 있었지만 대신 ints 배열로 재 할당하고있었습니다 (튜토리얼에서 코드를 가져 와서 변경하는 것을 잊었 기 때문에). 컴파일러는 크기 인수의 내용을 확인할 수 없기 때문에 나를 수정하지 않았습니다. 내 변수는 다음과 같습니다.

itemsetList_t ** iteration_isets;

따라서 realloc에서는 다음과 같습니다.

iteration_isets = realloc(iteration_isets, sizeof(itemsetList_t *) * max_elem);

나는 :

iteration_isets = realloc(iteration_isets, sizeof(int) * max_elem);

그리고 이것은 내 힙 문제를 일으켰습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top