2012-06-22 2 views
4

언젠가는 스택을 감지하여 스매싱 오류가 발생하는 프로그램을 만들었습니다. 시간의 99 %를 사용하지만 특정 파일의 경우 오류가 발생합니다. valgrind를 사용하여 오류를 식별하려고했지만 로그 파일을 이해하는 데 문제가 있습니다. 그래서 여기있다 :C 스택 밸런스 오류 이해, 스택 스매싱 오류

==3797== Memcheck, a memory error detector 
==3797== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. 
==3797== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info 
==3797== Command: ./pargrep de nuevo.txt 
==3797== Parent PID: 2367 
==3797== 
==3797== 
==3797== HEAP SUMMARY: 
==3797==  in use at exit: 33,339 bytes in 5 blocks 
==3797== total heap usage: 12 allocs, 7 frees, 35,025 bytes allocated 
==3797== 
==3797== 4 bytes in 1 blocks are still reachable in loss record 1 of 5 
==3797== at 0x4026864: malloc (vg_replace_malloc.c:236) 
==3797== by 0x8048FDB: maestro (padre.c:39) 
==3797== by 0x8048ABF: main (main.c:62) 
==3797== 
==3797== 55 bytes in 1 blocks are still reachable in loss record 2 of 5 
==3797== at 0x4026864: malloc (vg_replace_malloc.c:236) 
==3797== by 0x40B878B: __libc_message (libc_fatal.c:138) 
==3797== by 0x413D09F: __fortify_fail (fortify_fail.c:32) 
==3797== by 0x413D049: __stack_chk_fail (stack_chk_fail.c:29) 
==3797== by 0x8049665: contar_palabra (funcion.c:51) 
==3797== by 0x80494C5: hilos_hijos (hilos.c:90) 
==3797== by 0x4041E98: start_thread (pthread_create.c:304) 
==3797== by 0x41279ED: clone (clone.S:130) 
==3797== 
==3797== 136 bytes in 1 blocks are possibly lost in loss record 3 of 5 
==3797== at 0x4025315: calloc (vg_replace_malloc.c:467) 
==3797== by 0x4010CD7: allocate_dtv (dl-tls.c:300) 
==3797== by 0x401146B: _dl_allocate_tls (dl-tls.c:464) 
==3797== by 0x40425C6: [email protected]@GLIBC_2.1 (allocatestack.c:570) 
==3797== by 0x80490E1: maestro (padre.c:84) 
==3797== by 0x8048ABF: main (main.c:62) 
==3797== 
==3797== 352 bytes in 1 blocks are still reachable in loss record 4 of 5 
==3797== at 0x4026864: malloc (vg_replace_malloc.c:236) 
==3797== by 0x40B3537: __fopen_internal (iofopen.c:76) 
==3797== by 0x40B360B: [email protected]@GLIBC_2.1 (iofopen.c:107) 
==3797== by 0x804907D: maestro (padre.c:66) 
==3797== by 0x8048ABF: main (main.c:62) 
==3797== 
==3797== 32,792 bytes in 1 blocks are still reachable in loss record 5 of 5 
==3797== at 0x4026864: malloc (vg_replace_malloc.c:236) 
==3797== by 0x40EBA18: __alloc_dir (opendir.c:186) 
==3797== by 0x40EBB49: opendir (opendir.c:141) 
==3797== by 0x8049013: maestro (padre.c:53) 
==3797== by 0x8048ABF: main (main.c:62) 
==3797== 
==3797== LEAK SUMMARY: 
==3797== definitely lost: 0 bytes in 0 blocks 
==3797== indirectly lost: 0 bytes in 0 blocks 
==3797==  possibly lost: 136 bytes in 1 blocks 
==3797== still reachable: 33,203 bytes in 4 blocks 
==3797==   suppressed: 0 bytes in 0 blocks 
==3797== 
==3797== For counts of detected and suppressed errors, rerun with: -v 
==3797== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 15 from 8) 

내가 정말 error.I이 도움을 주셔서 감사합니다 무슨 이해 해달라고.

답변

0

Valgrind는 메모리가 할당되었음을 알려주고 (그리고 malloc에 ​​대한 호출 방법에 대한 스택 추적을 보여 주지만) 그 할당에서 얻은 메모리는 결코 해제되지 않았습니다.

자세한 내용은 http://valgrind.org/docs/manual/mc-manual.html#mc-manual.leaks 당신은 스택 smahing와 힙 메모리 오류 beween 다를 필요가

+0

나는 당신이 말하는 것을 이해합니다. 나는 "여전히 도달 할 수있는"오류의 행을 검사했고 그 행은 전역 변수에 값을 할당하는 곳입니다. 아마도 잃어버린 것은 많은 수의 쓰레드를 만들 때입니다. 레코드 2는 그 라인이 함수의 끝이다. 그래서 나는 정말로 문제가 어디에 있는지 전혀 모른다. – Alessandroempire

+0

여전히 도달 할 수 있다는 것은 프로그램이 여전히 할당 된 메모리에 대한 포인터를 보유하고 있음을 의미합니다. 아마도 valgrind는 아마도 메모리 할당에 대한 포인터를 지웠을 것이라고 생각하지만, 결코 메모리를 해제하지는 않는다는 것을 의미합니다. malloc은 스택이 아닌 힙 메모리이기 때문에 이러한 메모리 누수는 다른 문제와 관련이 없습니다. 어떤 경우에는 힙 할당을 해제하는 것이 프로그램을 종료 할 때 모두 해제되므로 가치있는 연습은 아닙니다. – mlibby

5

에서 찾을 수 있습니다.

Valgrind는 일부 메모리가 해제되지 않았고 일부 메모리가 손실되었을 수 있음을 알려줍니다. 그러나 그것은 당신의 진짜 문제와는 아무런 관련이 없을 것입니다.

스택은 의미 : 지역 변수 (종종 문자 배열),

힙 등 할당되지 않은 다른 배열 :

그래서 만약 realloc을 등의 malloc,은 calloc과 alloced 된 것도 스택 스매싱을하고, 기회가 높으며, 어딘가에 배열의 끝을 쓸 수 있습니다. strcpy, memcpy 및 배열 액세스 (먼저 할당되지 않은 메모리에 쓰는 위치)를 확인하십시오.

+0

+1 자동 및 동적 저장 기간 오류를 구별합니다. –

0

valgrind는 관찰 된 스택 스매싱의 원인 일 수있는 array overruns을 감지하지 못합니다.

2

Valgrind 3.7.0을 사용하면 스택 오버런 및 글로벌 오버런을 발견하는 실험 도구 exp-sgcheck 을 사용해 볼 수 있습니다. 이 도구는 실험 도구이므로 memcheck 및 기타 실험적이지 않은 Valgrind 도구로 고품질 이 아닐 수도 있습니다. (예 : 거짓 긍정 및/또는 가짜 음성을 줄 수 있음) 그러나 exp-sgcheck는 한번 이상한 배열 오버런 버그를 찾는데 도움이되었습니다.