2011-11-16 3 views
1

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"); 
+1

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. –

+1

Avez-vous vérifié que 'tid' se trouve toujours entre' 0' et '15'? –

+0

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é. –

Répondre

3

OK, je l'ai maintenant. En fait, je l'utilisais pour plusieurs threads. C'est pourquoi uctx_main[16] et uctx_func[16] sont des tableaux. Cependant, j'ai oublié de faire func_stack également un tableau (un tableau bidimensionnel en fait). Donc, je l'ai changé à char func_stack[16][16384] et il a résolu le problème.

3

Essayez d'améliorer la pile Valgrind traces - cela vous aidera à comprendre, espérons-le problème. Utilisez-vous les options ou -fstack-check gcc? Cela peut aggraver les traces de la pile Valgrind (avec ??? symboles au lieu des noms) Valgrind FAQ.