Что означает эта ошибка в Valgrind - PullRequest
1 голос
/ 16 ноября 2011

Когда я запускаю свою программу, у меня возникает ошибка сегментации, поэтому я решил проверить ее через 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");  

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

ОК, я понял. На самом деле я использовал это для нескольких потоков. Вот почему uctx_main[16] и uctx_func[16] являются массивами. Однако я забыл сделать func_stack также массивом (фактически двумерным массивом). Поэтому я изменил его на char func_stack[16][16384], и это решило проблему.

3 голосов
/ 16 ноября 2011

Попробуйте улучшить трассировку стека Valgrind - надеюсь, это поможет понять проблему. Вы используете опции -fomit-frame-pointer или -fstack-check gcc? Это может ухудшить трассировку стека Valgrind (с ??? символами вместо имен) FAQ по Valgrind .

...