2011-11-16 1 views
1

프로그램을 실행할 때 세그먼트 오류가 발생하여 Valgrind를 통해 확인하기로 결정했습니다. 내가 그랬을 때, 나는 Valgrind에게서 다음 메시지를 얻었다. 여기에 설명 된 코드를 사용하면 오류가 발생합니다. 무슨 일이 벌어지고 있는거야?Valgrind에서이 오류의 의미

==21471== Invalid write of size 8 
==21471== at 0x4802511: _vgnU_freeres (vg_preloaded.c:64) 
==21471== by 0x38A715397F: ??? 
==21471== by 0x38A6E4D549: printf (in /lib64/libc-2.5.so) 
==21471== by 0x401D52: call_func(int) (replication.cpp:752) 
==21471== by 0x6137C7: ??? 
==21471== by 0x40621C: AdvanceFramesMT(void*) (pthreads.cpp:1020) 
==21471== by 0x38A7A0673C: start_thread (in /lib64/libpthread-2.5.so) 
==21471== by 0x38A6ED44BC: clone (in /lib64/libc-2.5.so) 
==21471== Address 0x612ba8 is 14216 bytes inside data symbol "func_stack" 

코드

static char func_stack[16384]; 
static ucontext_t uctx_main[16], uctx_func[16]; 

void call_func(int n) 
{ 
    printf("Message %d!", n); 
} 

if (getcontext(&uctx_func[tid]) == -1) 
     handle_error("getcontext"); 
uctx_func[tid].uc_stack.ss_sp = func_stack; 
uctx_func[tid].uc_stack.ss_size = sizeof(func_stack); 
uctx_func[tid].uc_link = &uctx_main[tid]; 
makecontext(&uctx_func[tid], (void(*)())call_func, 1, 2); 

if (swapcontext(&uctx_main[tid], &uctx_func[tid]) == -1) 
    handle_error("swapcontext"); 
+1

코드를 복사하면 실행 중 및 valgrind에서 모두 정상적으로 작동합니다. 오류는 다른 것 때문에 발생해야합니다. –

+1

'tid'가 항상 '0'과 '15'사이에 있는지 확인 했습니까? –

+0

당신은'replication.cpp' (또는'pthreads.cpp'의 1020 번 줄은 중요하지 않을 수도 있지만)에서 752 줄을 확인하지 않았습니다. 문자 배열에 8 바이트 씩 쓰는 것에 대해 불평하는지 여부는 명확하지 않습니다. 그것은 조금있을 법하지 않습니다. 그것은 잘못되었거나, 잘못 정렬되지 않았을 때 부적절하게 정렬 될 수 있습니다. –

답변

3

이제 알았습니다. 사실 나는 이것을 여러 스레드에 사용하고있었습니다. 따라서 uctx_main[16]uctx_func[16]은 배열입니다. 그러나, 나는 func_stack을 배열 (실제로 2 차원 배열)로 만드는 것을 잊었다. 그래서 이것을 char func_stack[16][16384]으로 변경하고 문제를 해결했습니다.

3

봅니다 Valgrind의 스택 트레이스를 개선하기 위해 -이 잘하면 문제를 이해하는 데 도움이 될 것입니다. 또는 -fstack-check gcc 옵션을 사용하고 있습니까? 이로 인해 Valgrind 스택 추적이 더 악화 될 수 있습니다 (이름 대신 ??? 기호로) Valgrind FAQ.