프로그램을 실행할 때 세그먼트 오류가 발생하여 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");
코드를 복사하면 실행 중 및 valgrind에서 모두 정상적으로 작동합니다. 오류는 다른 것 때문에 발생해야합니다. –
'tid'가 항상 '0'과 '15'사이에 있는지 확인 했습니까? –
당신은'replication.cpp' (또는'pthreads.cpp'의 1020 번 줄은 중요하지 않을 수도 있지만)에서 752 줄을 확인하지 않았습니다. 문자 배열에 8 바이트 씩 쓰는 것에 대해 불평하는지 여부는 명확하지 않습니다. 그것은 조금있을 법하지 않습니다. 그것은 잘못되었거나, 잘못 정렬되지 않았을 때 부적절하게 정렬 될 수 있습니다. –