2008-11-04 2 views
4

gdb에서 C++ 프로그램을 실행하고 있습니다. gdb에서 실제로 경험하지는 않지만 다음과 같은 메시지가 나타납니다.GDB 및 C++로 메모리 오류 디버그

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

어디에서이 문제가 발생했는지 어떻게 추적 할 수 있습니까? 기억을 보면 나에게 단서가 주어지지 않습니다.

감사합니다.

답변

4

그래서 힙을 파열하고 있습니다. 명심할 것은 GDB tutorial입니다.

정상적인 연습은 코드의 잘 알려진 부분에 휴식을 설정하는 것입니다. 일단 오류가 날 때까지 단계를 거쳐야합니다. 일반적으로 문제는 그런 식으로 판단 할 수 있습니다.

힙 오류가 발생하기 때문에 힙에 넣는 것과 관련이 있다고 가정하므로 변수에 특별한주의를 기울이십시오 (GDB에서 인쇄를 사용하여 메모리 주소를 결정할 수 있다고 생각합니다. 오류가 발생한 곳과 사용자를 동기화 할 수 있습니다). 함수를 입력하고 함수에서 돌아 오는 것이 힙을 가지고 놀아서 문제가있는 곳이 될 수 있음을 기억해야합니다 (특히 함수에서 돌아 오기 전에 힙을 엉망으로 만든 경우).

1

아마도 "감시 점"이라는 기능을 사용할 수 있습니다. 이것은 중단 점과 같지만 메모리가 수정되면 디버거가 중지됩니다.

다른 질문에 answer에서 이것을 사용하는 방법에 대한 대략적인 아이디어를 제공했습니다.

1

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

1

MALLOC_CHECK_ envronment 변수가 구성된 표준 libc와 동일한 종류의 작업이므로 (man libc) 시도해 볼 수있는 한 가지 방법이 있습니다.

gdb를 종료하지 않으려면 (응용 프로그램이 종료 된 경우 "r"을 사용하여 다시 실행하십시오) 해당 주소 "hbreak 0x64EA569"에 메모리 중단 점을 설정하고 "help hbreak"를 사용하여 과도하게 그 중단 점에 들어가는 것을 방지하기 위해 조건 또는 다른 breakpoitn 활성화/비활성화 옵션을 구성하십시오 ....

로그 파일을 구성하고 로그를 설정할 수 있습니다 ... 모든 중단시 스택 추적을 설정하십시오 "display/bt -4 "라고 입력 한 다음 r 키를 누른 다음 Enter 키를 누른 상태에서 으로 스크롤하거나 C##을 사용하여 x 번 ... 등을 계속 스크롤합니다."결국 동일한 어설 션을 보게 될 것입니다. (display/bt로 인해) 어떤 주소로 코드가 수정되었는지를 확인할 수있는 stacktrace를 ...

0

내 구조체에 포인터 배열을 다시 할당하려고했지만 비슷한 문제가 발생했지만 대신 int 배열로 다시 할당했습니다. 왜냐하면 튜토리얼에서 코드를 가져 와서 변경하는 것을 잊었 기 때문입니다. 컴파일러는 크기 인자가 무엇인지 검사 할 수 없기 때문에 저를 정정하지 못했습니다. 내 변수였다 realloc을 너무

itemsetList_t ** iteration_isets;

대신 필요없이 :

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

내가 가진 :

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

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