如何调试由其他用户运行的程序?

时间:2012-01-04 10:37:20

标签: permissions gdb remote-debugging

假设我正在编写并使用用户alice编译程序。然后该程序由用户bob在同一台机器上运行,但是从alice无法访问的位置运行。

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 个答案:

答案 0 :(得分:7)

远程调试

Alice和Bob应该使用远程调试。 Bob启动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使用其共享库的绝对路径时,需要更复杂一些:

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

现在,alice无法找到共享库:

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创建了一个虚拟根文件夹,其中包含指向其二进制文件的链接:

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 :(得分:1)

Alice应该获得调试bob启动的进程的权限。 Alice可以通过成为超级用户(sudo gdb)或将gdb作为Bob(sudo -u bob gdb)运行来实现此目的。

也许有一个权限标志可以用来允许其他用户调试,但我不会指望它。