2012-01-04 17 views
5

私はuser aliceを使ってプログラムを作成しています。このプログラムは、同じマシン上のユーザボブによって実行されますが、アリスがアクセスできない場所から実行されます。別のユーザーが実行しているプログラムをどのようにデバッグできますか?

[email protected]:/home/alice$ g++ helloworld.cpp -o helloworld -g 

[email protected]:/home/bob$ cp ../alice/helloworld . 
[email protected]:/home/bob$ ./helloworld 

ここで、アリスはボブが何をしているのかをデバッグしたいと考えています。ボックス外でこれはできません:

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

アリスは何をすべきですか?

+0

この質問をAlice-Bob memeを使用して表現すると、非常に理解しやすく、非常に簡単に答えることができます。 – parasietje

答えて

6

リモートデバッグ

アリスとボブは、リモートデバッグを使用する必要があります。ボブはgdbserverを起動します:

[email protected]:/home/bob$ gdbserver :2345 ./helloworld 

そしてアリスは、それに接続します。これは、この単純なケースで動作し、絶対パス

[email protected]:/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 

リモートデバッグ。

[email protected]:/home/bob$ ls 
helloworld libmylib.so 
[email protected]:/home/bob$ LD_LIBRARY_PATH=/home/bob gdbserver :2345 ./helloworld 

、アリスは、共有ライブラリを見つけることができません:しかし、いくつかのより洗練されたが、ボブが彼の共有ライブラリの絶対パスを使用している場合requriedされ、これを解決するために

[email protected]:/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. 

を、アリスは、仮想を作成し、バイナリへのへのリンクとルートフォルダ:

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

そして今、ロードされたすべてのシンボルでデバッグすることができます:

[email protected]:/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) 
+0

掘り出して試したところ、私はこれを見つけました。ソリューションにはかなり満足しています。たぶん私はまだinitファイルで物事を自動化することができます... –

1

アリスは、bobが起動したプロセスをデバッグするための権限を取得する必要があります。 Aliceはスーパーユーザ(sudo gdb)になるか、gdbをBob(sudo -u bob gdb)として実行することでこれを行うことができます。

おそらく、他のユーザーからのデバッグを許可するために使用できるアクセス許可フラグがありますが、それにはカウントされません。

+0

良い点!デバッグはgdbをbobとして実行しますが、bobがaliceのソースコードを読み取ることができない場合は、利用できません。私はgdbをrootとして実行しない方がいいです。 –

関連する問題