2011-11-16 71 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'中的行752(或'pthreads.cpp'中的行1020,儘管這可能沒有關係)。目前還不清楚它是否抱怨8字節的字符數組一次寫入;但是這是不太可能的。雖然......或者,如果沒有錯位,那麼它可能會被錯誤地對準,然後被次優化地對齊。 –

回答

3

好的,我現在明白了。其實我用這個多線程。這就是爲什麼uctx_main[16]uctx_func[16]是數組。但是,我忘記了func_stack也是一個數組(實際上是一個2維數組)。所以我將其更改爲char func_stack[16][16384]並解決了問題。

3

儘量提高Valgrind的堆棧跟蹤 - 這希望能幫助理解這個問題。您是使用還是-fstack-check gcc選項?這可能會使Valgrind堆棧跟蹤更糟糕(使用???符號代替名稱)Valgrind FAQ