Lorsque j'exécute mon programme, j'obtiens un défaut de segmentation, j'ai donc décidé de le vérifier via Valgrind. Quand je l'ai fait, j'ai reçu le message suivant de Valgrind. Et j'obtiens l'erreur quand j'utilise le code décrit ici. Une idée de ce qui se passe ici?Que signifie cette erreur dans 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"
code
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");
Si je viens de copier le code que vous montrez, cela fonctionne très bien pour moi, à la fois en cours d'exécution et en valgrind. L'erreur doit être due à autre chose. –
Avez-vous vérifié que 'tid' se trouve toujours entre' 0' et '15'? –
Vous n'avez pas identifié la ligne 752 dans 'replication.cpp' (ou la ligne 1020 dans' pthreads.cpp', même si cela n'a pas d'importance). Il n'est pas clair s'il se plaint d'une écriture de 8 octets à la fois dans un tableau de caractères; C'est un peu improbable, cependant. Il pourrait être faussé, bien que ... ou, si pas mal aligné, alors sous-optimalement aligné. –