Как отладить программу, запущенную другим пользователем? - PullRequest
5 голосов
/ 04 января 2012

Скажем, я пишу и компилирую программу с пользователем alice.Затем программа запускается пользователем bob на той же машине, но из местоположения, к которому Алиса не может получить доступ.

alice@localhost:/home/alice$ g++ helloworld.cpp -o helloworld -g

bob@localhost:/home/bob$ cp ../alice/helloworld .
bob@localhost:/home/bob$ ./helloworld

Теперь Алиса хочет отладить, что делает bob.Из коробки это невозможно:

alice@localhost:/home/alice$ pidof helloworld
1234
alice@localhost:/home/alice$ gdb
[...]
(gdb) attach <pidof helloworld>
Attaching to process 1234
ptrace: Operation not permitted.

Что должна сделать Алиса?

Ответы [ 2 ]

7 голосов
/ 05 января 2012

Удаленная отладка

Алиса и Боб должны использовать удаленную отладку.Боб запускает gdbserver:

bob@localhost:/home/bob$ gdbserver :2345 ./helloworld

И Алиса подключается к нему:

alice@localhost:/home/alice$ gdb
[...]
(gdb) file helloworld
Reading symbols from /home/alice/helloworld...done.
(gdb) target remote :2345
Remote debugging using :2345
[...]
0x00007fbdc6329af0 in _start () from /lib64/ld-linux-x86-64.so.2

Удаленная отладка с абсолютными путями

Это работает так простодело.Тем не менее, некоторые дополнительные сложности требуются, когда Боб использует абсолютные пути для своих общих библиотек:

bob@localhost:/home/bob$ ls
helloworld  libmylib.so
bob@localhost:/home/bob$ LD_LIBRARY_PATH=/home/bob gdbserver :2345 ./helloworld

Теперь Алиса не может найти общую библиотеку:

alice@localhost:/home/alice$ gdb
[...]
(gdb) file helloworld
Reading symbols from /home/alice/helloworld...done.
(gdb) target remote :2345
Remote debugging using :2345
[...]
(gdb) break helloWorld() 
Breakpoint 1 at 0x400480
(gdb) c
Continuing.
Error while mapping shared library sections:
/home/bob/libmylib.so: No such file or directory.

Чтобы решить эту проблему,Алиса создает виртуальную корневую папку со ссылками на нее в двоичных файлах:

alice@localhost:/home/alice$ mkdir -p gdb-symbols/home/
alice@localhost:/home/alice$ ln -s /home/alice gdb-symbols/home/bob
alice@localhost:/home/alice$ ln -s /lib gdb-symbols/lib
alice@localhost:/home/alice$ ln -s /lib64 gdb-symbols/lib64
[and so forth for every shared library that cannot be found...]

и теперь может отлаживать все загруженные символы:

alice@localhost:/home/alice$ gdb
[...]
(gdb) file helloworld
Reading symbols from /home/alice/helloworld...done.
(gdb) target remote :2345
Remote debugging using :2345
[...]
Reading symbols from /home/alice/gdb-symbols/home/bob/libmylib.so...done.
Loaded symbols from /home/alice/gdb-symbols/home/bob/libmylib.so
(gdb)
1 голос
/ 04 января 2012

Алиса должна получить разрешения на отладку процесса, запущенного bob. Алиса может сделать это, став SuperUser (sudo gdb) или запустив gdb от имени Bob (sudo -u bob gdb).

Возможно, есть флаг разрешения, который вы можете использовать для разрешения отладки от других пользователей, но я бы не стал на это рассчитывать.

...