2009-11-09 7 views
7

Me postulo valgrind de la siguiente manera: -¿cómo ejecuto valgrind en un proceso que tiene bit de superusuario?

/usr/local/bin/valgrind "process_name"

Después excecution me facilita siguiente error

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

mi permiso valgrind es el siguiente: - -r-sr-xr-x/usr/local/bin/valgrind

mi permiso proceso es el siguiente: - -r-sr-xr-x "process_name"

Plataforma: Linux VMLINUX3 2.6.9-78.0.22.ELsmp (RHEL)

versión Valgrind: valgrind-3.5.0

Cualquier ayuda en esto será apreciado

Respuesta

3

Este es un problema perpetuo para las personas que desarrollan sistemas de archivos FUSE. This link may help (es literalmente demasiado para consolidar en una sola respuesta). La solución temporal implica un reemplazo justo a tiempo de fusermount y (dependiendo), algunas opciones adicionales para valgrind para evitar que rastree a los niños.

De hecho, si ejecuta mis FS bajo valgrind, se obtiene este resultado (sí, suficientes personas tenían ese problema que realmente detectado valgrind en el arranque y se muestra el enlace):

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

El lo más fácil es hacer todas las depuraciones en una máquina virtual desechable que se ejecuta como root, donde puede deshacerse del bit de setuid y terminar con eso. Asegúrese de probar su código para no tener ninguna fuga o violación, es fácil de probar cualquier código de biblioteca vinculado que no utilice fusible. Libere su construcción de 'valgrind-clean' y tenga en cuenta que lo ha hecho en la documentación.

Luego, tome algunos bits de valgrind/valgrind.h para detectarlo, y muestre un mensaje corto para los que siguen adelante y ejecútelo de todos modos. Los hacks para solucionarlo requieren cooperación de raíz, y francamente, son mucho más fáciles de hacer en una caja de arena también.

También es bastante fácil negarse a ejecutar en valgrind con el bit de configuración activado, mostrando un mensaje útil para que las personas lo desactiven si realmente quieren hacerlo.

-1

Ejecutar el comando valgrind como root (o sea quien sea el usuario de set-uid), entonces el programa no tendrá que hacer uso de la configuración del uid.

+0

A veces, eso no es posible :) –

+0

Esto ocurre incluso cuando las cosas eran ejecutar como usuario root :) La mejor manera es cambiar las permanentes para eliminar "s", y ejecutar –

1

Supongo que has intentado ejecutarlo con --trace-children = no? Si tiene acceso de administrador, parece que hay una solución here.

3

Supongo que la respuesta más simple sería eliminar el bit setuid/setgid durante la depuración. Por supuesto, si el programa realmente necesita privilegios de raíz, probablemente deba ejecutar valgrind como root o, como valgrind en sí mismo parece ser setuid, simplemente ciérrelo en root: root. Si ejecuta valgrind después de eso, tendrá privilegios de administrador (y lo mismo ocurrirá con los procesos depurados).

Debería poder ejecutar valgrind en esa aplicación.

Solo tenga cuidado, porque introducirá un gran agujero de seguridad en su sistema. Una solución más segura sería crear un grupo especial solo para usuarios que deberían poder ejecutar (setuid) valgrind e ir desde allí ...

+0

Si fuera así de simple en todos los casos. FUSE depende de un asistente setuid, que no puede ser desactivado por los usuarios infrautilizadores para la depuración, por lo que es extremadamente difícil detectar fugas de memoria en los sistemas de archivos FUSE. Sin embargo, una buena respuesta para el tema en cuestión, siento bajar en tangente, esta es una de mis frustraciones diarias :) –

+0

Cierto, como (casi) siempre hay excepciones, pero en general este enfoque debería ser el truco. – Stan

0

Esto ocurre incluso cuando las cosas se ejecutan como usuario root :) mejor forma es cambiar las ondulaciones permanentes para eliminar "s", y ejecutar

Cuestiones relacionadas