当使用setjmp和longjmp时,Valgrind会失败
Valgrind fails when using setjmp and longjmp
我被分配了一个任务,使用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_DEREGISTER
和VALGRIND_STACK_CHANGE
客户端请求。
相关文章:
- 如果没有malloc,链表实现将失败
- valgrind-hellgrind与泄漏检查的结果不同
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- C++二进制文件在使用valgrind运行时执行良好,但在单独运行此二进制文件时失败
- 当使用setjmp和longjmp时,Valgrind会失败