Valgrind 显示调用 pr_set_ptracer 时出错,vgdb 可能会阻塞

Yog*_*ngh 11 c valgrind

我正在使用 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),那就太好了。

  • 感谢您的评论,我自己刚刚在 WSL 上看到了同样的事情。 (11认同)
  • 哦!感谢您的回复,我没有写出有问题的内容,但我在 wsl 上使用 valgrind 时遇到此错误,而不是在裸 Linux 中使用同一程序。所以,情况可能是这样,但是我得到了相同的结果,所以没有问题。 (6认同)
  • 在 WSL 上看到了同样的事情,似乎已在 [Build 17723](https://docs.microsoft.com/en-us/windows/wsl/release-notes) 中修复。 (4认同)