当使用setjmp和longjmp时,Valgrind会失败

Valgrind fails when using setjmp and longjmp

本文关键字:Valgrind 失败 longjmp setjmp      更新时间:2023-10-16

我被分配了一个任务,使用signals、setjmp和longjmp c函数模拟一个用户级线程库。基本上,该程序包括为每个"线程"分配内存,并使用跳远和信号来模拟非直接代码流和抢占。

当我运行valgrind工具时,我得到以下形式的消息:" " "

Invalid write of size 8
==19100== at 0x560020F: __sigsetjmp (setjmp.S:36)
==19100== by 0x403EC3: switchThreads(bool, bool, bool) (uthreads.cpp:673)
==19100== by 0x403DE6: signalHandler(int) (uthreads.cpp:652)
==19100== by 0x56004EF: ??? (in /lib/x86_64-linux-gnu/libc-2.13.so)
==19100== by 0x404D93: t1() (tal3.cpp:23)
==19100== Address 0x5959c90 is 48 bytes inside a block of size 4,312 alloc'd
==19100== at 0x4C2851B: operator new(unsigned long, std::nothrow_t const&) (vg_replace_malloc.c:316)
==19100== by 0x402E67: uthread_spawn(void (*)()) (uthreads.cpp:358)
==19100== by 0x404DD6: main (a3.cpp:41)

" " "

我读过这个工具的一些论坛和文档,从我的理解,它似乎长跳跃和'setjmp'(只要信号处理跳跃)不支持在valgrind,从而导致什么似乎是内存问题-但我不能想出一个明确的答案。

非常感谢你的帮助。谢谢。

似乎在valgrind中不支持长跳和'setjmp'(只要信号处理跳),

更准确地说:Valgrind不支持直接通过{sig,}longjmp进行"自定义"堆栈切换。

你可以放置特殊的Valgrind注释来通知Valgrind你正在执行的堆栈切换,但这可能不是一件容易的事。参考本文档,VALGRIND_STACK_REGISTER, VALGRIND_STACK_DEREGISTERVALGRIND_STACK_CHANGE客户端请求。