2009-11-09 5 views
7

Я бегу Valgrind следующим образом: -Как я могу запустить valgrind для процесса, который имеет супер пользовательский бит?

/USR/местные/бен/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 выглядит следующим образом: - Valgrind

разрешение -r-стер-хт-х/USR/местные/бен/Мой процесс выглядит следующим образом: - -r-стер-хт-х "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, чтобы предотвратить ее отслеживание детей.

В самом деле, если вы запускаете FS под Valgrind, вы получите этот выход (да, достаточно людей были эта проблема, что я на самом деле обнаружен 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, чтобы обнаружить его, и покажите короткое сообщение для тех, которые идут вперед и запускают его в любом случае. Взломы, чтобы обойти его, требуют коренного сотрудничества, и, откровенно говоря, гораздо проще сделать в песочнице.

Это также достаточно легко отказать в запуске под valgrind с битом setuid, показывая полезное сообщение для людей, чтобы он обернулся , если они действительно хотят это сделать.

-1

Выполните команду Valgrind как root (или кто бы ни был пользователем set-uid), тогда программе не нужно будет использовать настройку uid.

+0

Иногда это просто не возможно :) –

+0

Это происходит даже тогда, когда все было запускаться как пользователь root. Лучший способ - изменить perms, чтобы удалить «s», и запустить –

1

Я предполагаю, что вы пытались запустить его с помощью --trace-children = no? Если у вас есть доступ к корневому файлу, то есть обходной путь here.

3

Я предполагаю, что самый простой ответ - удалить бит setuid/setgid во время отладки. Конечно, если программе действительно нужны привилегии root, вам, вероятно, придется запускать valgrind как root или, поскольку, как кажется, valgrind кажется setuid, просто откорректируйте его root: root. Если вы выполните valgrind после этого, у него будут привилегии root (и так будут дочерние - отлаженные процессы).

Затем вы должны будете запустить valgrind в этом приложении.

Просто будьте осторожны, потому что вы внесете в свою систему отверстие безопасности BIG. Более безопасным решением будет создание специальной группы только для пользователей, которые должны иметь возможность запускать (setuid) valgrind и перейти оттуда ...

+0

Если бы все было так просто во всех случаях. FUSE опирается на помощник setuid, который не может быть отключен пользователями underpriv для отладки, поэтому чрезвычайно сложно обнаружить утечки памяти в файловых системах FUSE. Тем не менее, хороший ответ на эту тему, извините, что сошел с тангенса, это одно из моих ежедневных разочарований :) –

+0

Правда, поскольку (почти) всегда есть исключения, но в целом этот подход должен делать трюк. – Stan

0

Это происходит даже тогда, когда вещи были работать как корневой пользователь :) Лучший способ изменить завивку для удаления «с», и запустить