2012-01-04 9 views
5

Dire che sto scrivendo e compilando un programma con l'utente alice. Il programma viene quindi eseguito dall'utente bob sulla stessa macchina, ma da una posizione a cui Alice non può accedere.Come si esegue il debug di un programma eseguito da un altro utente?

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

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

Ora, alice vuole eseguire il debug di ciò che bob sta facendo. Fuori dalla scatola, questo non è possibile:

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

Cosa dovrebbe fare Alice?

+0

Complimenti per la formulazione di questa domanda utilizzando il meme Alice-Bob, rende molto comprensibile ed estremamente facile rispondere correttamente. – parasietje

risposta

6

debug remoto

Alice e Bob dovrebbero utilizzare il debug remoto. Bob inizia gdbserver:

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

E Alice si connette ad esso:

[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 

debug remoto con percorsi assoluti

Questo funziona in questo caso semplice. Tuttavia, un po 'di sofisticazione è requried quando Bob utilizza i percorsi assoluti per le sue librerie condivise:

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

Ora, Alice non riesce a trovare la libreria condivisa:

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

per risolvere questo, Alice crea una virtuale cartella principale con il link al proprio su binari:

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

Ed è ora in grado di eseguire il debug con tutti i simboli caricati:

[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

Dopo aver scavato e provato, ho trovato questo. Abbastanza felice con la soluzione. Forse posso ancora automatizzare le cose con i file init ... –

1

Alice dovrebbe ottenere le autorizzazioni per eseguire il debug del processo avviato da bob. Alice può farlo diventando un SuperUser (sudo gdb) o eseguendo gdb come Bob (sudo -u bob gdb).

Forse c'è un flag di autorizzazione che è possibile utilizzare per consentire il debug da altri utenti, ma non ci conterei.

+0

Buon punto! Il debug funziona eseguendo gdb come bob, ma se bob non può leggere il codice sorgente di Alice, non sarà disponibile. Preferirei evitare di eseguire gdb come root. –

Problemi correlati