2009-11-09 24 views
7

我运行的valgrind如下: -我如何运行valgrind到一个拥有超级用户位的进程?

在/ usr/local/bin目录/ Valgrind的 “PROCESS_NAME”

excecution它给我下面的错误后

==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

任何帮助可以理解

回答

3

这是开发FUSE文件系统的人员的永久性问题。 This link may help(在一个单一的答案中合并太过分了)。解决方法是及时更换fusermount,并(取决于)valgrind的一些附加选项,以防止其跟踪儿童。

事实上,如果你下的valgrind运行我的FS,你得到这个输出(是的,足够多的人有,我实际检测的valgrind上启动了这一问题,显示的链接):

[email protected]:~ # 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位,并完成它。确保你测试你的代码没有任何泄漏或违规,它足够容易测试任何链接库代码不使用保险丝。把你的构建关掉'valgrind-clean'并且注意你在文档中这样做了。

然后,从valgrind/valgrind.h中取出一些位来检测它,并为那些继续运行它的人显示一条短消息。要想解决这个问题,需要开展合作,坦率地说,在沙盒中也可以轻松完成。

也很容易拒绝在setuid位打开的情况下在valgrind下运行,如果他们真的想要这样做,则会显示一条有用的消息让人们将其变为关闭

-1

运行Valgrind的命令作为根(或任何set-uid用户),那么程序将不必使用设置uid。

+0

有时候,这是不可能的:) – 2009-11-12 17:07:14

+0

出现这种情况,即使事情是以root用户身份运行:)最好的方法是更换perms以删除“s”,然后运行 – 2014-06-06 11:43:00

1

我假设你试着用--trace-children = no来运行它?如果你有root权限,似乎有一个解决方法here

3

我想最简单的答案是在调试时删除setuid/setgid位。当然,如果程序真的需要root权限,你将不得不以root身份运行valgrind,或者因为valgrind本身似乎是setuid,只是将其命名为root:root。如果在此之后执行valgrind,它将具有root权限(其子进程也将被调试)。

然后,您应该能够在该应用程序上运行valgrind。

请小心,因为您将在您的系统中引入大的安全漏洞。更安全的解决方案是只为那些应该能够运行(setuid)valgrind并从那里开始的用户创建特殊组...

+0

如果在所有情况下都这么简单。 FUSE依赖于setuid帮助程序,它不能由underpriv用户取消调试,因此在FUSE文件系统中检测内存泄漏非常困难。然而,对于手头的话题很好的回答,对不起,切线下车,这是我的日常挫折之一:) – 2009-11-09 15:56:46

+0

诚然,(几乎)总是有例外,但通常这种方法应该做的伎俩。 – Stan 2009-11-09 16:04:44

0

出现这种情况,即使事情root身份运行的用户:) 最好的办法是改变烫发删除“S”,并运行

相关问题