2012-01-04 8 views
5

Giả sử tôi đang viết và biên dịch một chương trình có sử dụng alice. Chương trình sau đó được chạy bởi người dùng bob trên cùng một máy, nhưng từ một vị trí mà alice không thể truy cập.Làm cách nào để gỡ lỗi chương trình do một người dùng khác thực hiện?

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

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

Bây giờ, alice muốn gỡ lỗi những gì bob đang làm. Ngoài hộp, điều này là không thể:

[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 nên làm gì?

+0

Những âm mưu về cách phân biệt câu hỏi này bằng meme Alice-Bob, nó làm cho nó rất dễ hiểu và rất dễ trả lời tốt. – parasietje

Trả lời

6

từ xa gỡ lỗi

Alice và Bob nên sử dụng gỡ lỗi từ xa. Bob bắt đầu gdbserver:

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

Và Alice kết nối với nó:

[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 

từ xa gỡ lỗi với đường dẫn tuyệt đối

này hoạt động trong trường hợp đơn giản này. Tuy nhiên, một số tinh tế hơn là requried khi Bob sử dụng đường dẫn tuyệt đối cho các thư viện chia sẻ của mình:

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

Bây giờ, alice không thể tìm thấy thư viện chia sẻ:

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

Để giải quyết điều này, Alice tạo ảo thư mục gốc có liên hệ với mình trên mã nhị phân:

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

Và bây giờ là có thể gỡ lỗi với tất cả những biểu tượng nạp:

[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

Sau khi đào một số và cố gắng, tôi tìm thấy điều này. Khá hài lòng với giải pháp. Có lẽ tôi vẫn có thể tự động hóa mọi thứ với các tệp init ... –

1

Alice nên có quyền để gỡ lỗi quy trình được khởi chạy bởi bob. Alice có thể làm điều này bằng cách trở thành một siêu người dùng (sudo gdb) hoặc bằng cách chạy gdb như Bob (sudo -u bob gdb).

Có thể có cờ cho phép bạn có thể sử dụng để cho phép gỡ lỗi từ những người dùng khác, nhưng tôi sẽ không tính vào nó.

+0

Điểm tốt! Gỡ lỗi hoạt động bằng cách chạy gdb như bob, nhưng nếu bob không thể đọc mã nguồn của alice, nó sẽ không có sẵn. Tôi muốn tránh chạy gdb như root. –