如何在具有超级用户位的进程上运行Valgrind?

15

我正在按以下方式运行valgrind:

/usr/local/bin/valgrind "进程名称"

执行后,它会给我以下错误信息:

==21731==
==21731== Warning: Can't execute setuid/setgid executable: 
==21731== Possible workaround: remove --trace-children=yes, if in effect
==21731==
valgrind: "process name": Permission denied

我的Valgrind权限如下:

-r-sr-xr-x /usr/local/bin/valgrind

我的进程权限如下:

-r-sr-xr-x "process_name"

平台:Linux VMLINUX3 2.6.9-78.0.22.ELsmp (RHEL)

Valgrind版本:valgrind-3.5.0

如果需要帮助,请随时联系我。

5个回答

4
这对于开发FUSE文件系统的人来说是一个永恒的问题。 该链接(几乎不可能在单个答案中整合所有内容)可能会有所帮助。解决方法涉及对fusermount进行即时替换,并且(取决于情况)需要一些额外的选项来防止valgrind跟踪子进程。
实际上,如果您在valgrind下运行我的FS,您将得到此输出(足够多的人遇到了这个问题,以至于我实际上检测到了启动上的valgrind并显示了链接)。
root@tower:~ # valgrind xsfs /xs
==9479== Memcheck, a memory error detector.
==9479== Copyright (C) 2002-2008, and GNU GPL'd, by Julian Seward et al.
==9479== Using LibVEX rev 1884, a library for dynamic binary translation.
==9479== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP.
==9479== Using valgrind-3.4.1, a dynamic binary instrumentation framework.
==9479== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al.
==9479== For more details, rerun with: -v
==9479==
******** Valgrind has been detected by xsfs
******** If you have difficulties getting xsfs to work under Valgrind,
******** see the following thread:
******** http://www.nabble.com/valgrind-and-fuse-file-systems-td13112112.html
******** Sleeping for 5 seconds so this doesn't fly by ....

最简单的方法是在以root身份运行的可丢弃虚拟机中进行所有调试,在其中可以轻松地放弃setuid位,然后就做完了。确保您测试了自己的代码,以确保没有任何泄漏或违规行为,并测试任何未使用fuse的链接库代码。将构建结果交给“valgrind-clean”,并在文档中注明您已这样做。
然后,从“valgrind/valgrind.h”中获取一些内容来检测它,并为那些仍然运行它的人显示一个短消息。绕过它的黑客技巧需要root的合作,而且坦率地说,在沙盒中也可以更容易地完成。
如果设置了setuid位,则拒绝在valgrind下运行也很容易,并为希望这样做的人显示有用的消息以将其关闭。

4
我想最简单的答案就是在调试时删除setuid/setgid位。当然,如果程序确实需要root权限,你可能需要以root身份运行valgrind,或者因为valgrind本身似乎已经设置了setuid,只需将其chown为root:root即可。之后执行valgrind将拥有root权限(以及它的子进程-被调试的进程)。
然后,您应该能够在该应用程序上运行valgrind。
只是要小心,因为这将在系统中引入一个大的安全漏洞。更安全的解决方案是为应该能够运行(setuid)valgrind的用户创建特殊组,并从那里继续...

如果所有情况都那么简单就好了。FUSE 依赖于 setuid 辅助程序,无法被非特权用户取消设置以进行调试,因此在 FUSE 文件系统中检测内存泄漏非常困难。不过,对于手头的主题来说这是一个好答案,抱歉离题了,这是我每天的挫败感之一 :) - Tim Post
真的,就像(几乎)总是有例外一样,但通常这种方法应该可以解决问题。 - Stan
仅以root身份运行valgrind似乎不够,但是使用chown命令可以解决问题! :) - rogerdpack

1

我假设你已经尝试使用--trace-children=no运行它了吗?如果你有root访问权限,这里似乎有一个解决方法here


2
此链接已失效。 - Cinder Biscuits
该页面可以在Wayback机器上找到。 https://web.archive.org/web/20100123225207/http://old.nabble.com/valgrind-and-fuse-file-systems-td13112112.html - Antonin Décimo

-1

以 root(或者 set-uid 用户)身份运行 valgrind 命令,这样程序就不必使用设置 uid 了。


1
有时候,那就是不可能的 :) - Tim Post

-1

即使以root用户运行,这种情况仍会发生 :) 最好的方法是更改权限以删除“s”,然后运行


suid并不意味着root。它意味着设置用户ID,其中“用户”可以是任何东西。 - Tõnu Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接