2012-01-04 50 views
5

假設我正在編寫和編譯用戶alice的程序。程序然後由用戶bob在同一臺機器上運行,但是從愛麗絲無法訪問的位置運行。如何調試由不同用戶運行的程序?

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

Alice應該做什麼?

+0

使用Alice-Bob meme來表達這個問題的榮譽,這使得它非常容易理解並且非常容易回答。 – parasietje 2012-01-04 10:47:22

回答

6

遠程調試

Alice和Bob應該使用遠程調試。鮑勃開始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 

使用絕對路徑

這個作品在這個簡單的情況下,遠程調試。然而,當Bob使用絕對路徑,他的共享庫的一些複雜的requried:

[email protected]:/home/bob$ ls 
helloworld libmylib.so 
[email protected]:/home/bob$ LD_LIBRARY_PATH=/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 
[...] 
(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創建虛擬鏈接到它的根文件夾中的二進制文件:

[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文件自動化事物... – 2012-01-05 09:49:50

1

Alice應該獲得調試bob啓動的進程的權限。 Alice可以通過成爲超級用戶(sudo gdb)或將gdb作爲Bob(sudo -u bob gdb)來執行此操作。

也許有一個許可標誌,你可以用來允許從其他用戶調試,但我不會指望它。

+0

好點!調試通過將gdb作爲bob運行,但如果bob無法讀取alice的源代碼,則它將不可用。我寧願避免以root身份運行gdb。 – 2012-01-04 10:56:45

相關問題