2009-11-09 18 views
7

Je courais valgrind comme suit: -Comment est-ce que je cours valgrind à un processus qui a le bit de super utilisateur dessus?

/usr/local/bin/valgrind "process_name"

Après excecution sa me donner erreur suivant

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

Ma permission valgrind est la suivante: - -r-sr-xr-x/usr/local/bin/valgrind

Mon autorisation de processus est le suivant: - -r-sr-xr-x "process_name"

Plate-forme: Linux VMLINUX3 2.6.9-78.0.22.ELsmp (RHEL)

Version Valgrind: valgrind-3.5.0

Toute aide à ce sujet sera apprécié

Répondre

3

Ceci est un problème perpétuel pour les personnes qui développent des systèmes de fichiers FUSE. This link may help (c'est littéralement trop de consolider dans une seule réponse). Le work-around implique un remplacement juste-à-temps de fusermount, et (selon), quelques options supplémentaires à valgrind pour l'empêcher de traçage des enfants.

En fait, si vous exécutez mon FS sous valgrind, vous obtenez cette sortie (oui, assez de gens avaient ce problème que je fait détecté valgrind au démarrage et affiche le lien):

[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 .... 

Le le plus facile chose à faire est tout votre débogage dans une machine virtuelle jetable fonctionnant en tant que root, où vous pouvez juste abandonner le bit setuid, et être fait avec. Assurez-vous de tester votre code pour ne pas avoir de fuites ou de violations, il est assez facile de tester tout code de bibliothèque lié n'utilisant pas de fusible. Donnez votre build 'valgrind-clean' et notez que vous l'avez fait dans la documentation.

Ensuite, prenez quelques bits sur valgrind/valgrind.h pour le détecter, et affichez un court message pour ceux qui vont de l'avant et exécutez-le quand même. Hacks à travailler autour de lui nécessitent une coopération de base, et très franchement, sont beaucoup plus faciles à faire dans un bac à sable tout aussi bien.

Il est également assez facile de refuser de s'exécuter sous valgrind avec le bit setuid, montrant ainsi un message utile pour que les gens le tournent off s'ils le veulent vraiment.

-1

Exécutez la commande valgrind en tant que root (ou quel que soit l'utilisateur set-uid), le programme n'aura pas à utiliser le réglage de l'uid.

+0

Parfois, c'est tout simplement pas possible :) –

+0

Cela se produit même quand les choses étaient Exécuter en tant qu'utilisateur root :) Le meilleur moyen est de changer les perms pour supprimer "s", et exécutez –

1

Je suppose que vous avez essayé de l'exécuter avec --trace-children = non? Si vous avez un accès root, il semble y avoir une solution de contournement here.

3

Je suppose que la réponse la plus simple serait de supprimer le bit setuid/setgid lors du débogage. Bien sûr, si le programme a vraiment besoin de privilèges root, vous devrez probablement exécuter valgrind en tant que root ou puisque valgrind lui-même semble être setuid juste le chier en root: root. Si vous exécutez valgrind après cela, il aura les privilèges root (et ainsi ses enfants - processus débogués).

Vous devriez alors pouvoir exécuter valgrind sur cette application. Faites attention, car vous allez introduire un trou de sécurité BIG dans votre système. Une solution plus sûre serait de créer un groupe spécial uniquement pour les utilisateurs qui devraient pouvoir exécuter (setuid) valgrind et partir de là ...

+0

Si seulement c'était aussi simple dans tous les cas. FUSE s'appuie sur une aide setuid, qui ne peut pas être désactivée par les utilisateurs de underpriv pour le débogage, il est donc extrêmement difficile de détecter les fuites de mémoire dans les systèmes de fichiers FUSE. Cependant, bonne réponse pour le sujet en question, désolé de sortir sur une tangente, c'est une de mes frustrations quotidiennes :) –

+0

Vrai, car (presque) toujours il y a des exceptions, mais en général cette approche devrait faire l'affaire. – Stan

0

Cela se produit même quand les choses ont été gérées comme utilisateur root :) La meilleure façon est de changer les perms pour enlever « s », et exécutez