当我运行程序时,我遇到分段错误,所以我决定通过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");
答案 0 :(得分:3)
尝试改进Valgrind堆栈跟踪 - 这有助于理解问题。您使用的是-fomit-frame-pointer
还是-fstack-check
gcc选项?这可能会使Valgrind堆栈跟踪更糟(使用???
符号而不是名称)Valgrind FAQ。
答案 1 :(得分:3)
uctx_main[16]
和uctx_func[16]
是数组的原因。但是,我忘了让func_stack
也成为一个数组(实际上是一个二维数组)。所以我将其更改为char func_stack[16][16384]
并解决了问题。