我正在使用 Valgrind 来查找我的 C 程序的内存泄漏,尽管它看起来运行良好并显示分配和释放的内存。但是,我想知道它为什么会抛出这个错误以及它的后果是什么。
这是错误的片段:
==483== Memcheck, a memory error detector
==483== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==483== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==483== Command: ./main ../old\ projects
==483==
==483== error calling PR_SET_PTRACER, vgdb might block
Run Code Online (Sandbox Code Playgroud)
phd*_*phd 17
vgdb 可执行文件(valgrind 的一部分)用于“连接”到 valgrind 以启动监视器命令或在 gdb 和在 valgrind 下运行的进程之间建立链接。如果您的进程在系统调用中被阻塞,则 vgdb 需要“唤醒”您的进程,为此必须能够“跟踪”您的进程。根据系统上安全性的配置方式,valgrind 可能必须告诉内核 ptrace 本身没问题。这是使用系统调用 prctl (PR_SET_PTRACER) 完成的。如果此系统调用失败,您会看到此消息。结果是,只要您的进程在系统调用中被阻塞,vgdb 就无法连接到您的进程。因此,除非您迫切需要在系统调用中被阻塞时调试您的进程,或者在系统调用中被阻塞时启动监视器命令,否则不会产生任何后果。
但是,不会出现此错误。所以,请在 valgrind bugzilla 上报告一个错误。附加以下输出: cat /proc/sys/kernel/yama/ptrace_scope 另外,如果您可以使用 strace -f valgrind 并提取系统调用 prctl (PR_SET_PTRACER) 失败的原因(尤其是 errno),那就太好了。