2013-05-09 27 views
5

Trên Linux, tôi có một ứng dụng C++ đang sử dụng dlopen() để tải một số thư viện được chia sẻ, nhưng tôi nghi ngờ rằng phiên bản của thư viện được tải không phải là phiên bản tôi mong đợi vì mã theo dõi gỡ lỗi của tôi không xuất hiện để được thực thi.Làm cách nào để kiểm tra quy trình đang chạy để xem thư viện được chia sẻ nào đang sử dụng?

Có cách nào để kiểm tra quy trình đang chạy để truy vấn tất cả các thư viện được chia sẻ mà hiện tại đã mở và đường dẫn đến từng thư viện đó không? Nói cách khác, một cái gì đó giống như ldd nhưng nó hoạt động trên một tệp thực thi đang chạy và liệt kê các thư viện tải thời gian chạy là tốt.

+1

thử 'lsof -p _process_id_' – stardust

+3

K đây là câu trả lời đầy đủ. http://stackoverflow.com/questions/5103443/how-to-check-what-shared-library-is-loaded-at-run-time – stardust

Trả lời

7

Nếu bạn muốn biết các tệp thư viện mà chương trình đã mở, bạn có thể thử pmap. Ví dụ, nếu chúng ta muốn biết các thư viện mà quá trình 3860 bash đã mở, kết quả có thể là:

3860: bash 
08048000 880K r-x-- /bin/bash 
08124000  4K r---- /bin/bash 
08125000  20K rw--- /bin/bash 
0812a000  20K rw--- [ anon ] 
099ae000 348K rw--- [ anon ] 
b715c000  44K r-x-- /lib/i386-linux-gnu/libnss_files-2.15.so 
b7167000  4K r---- /lib/i386-linux-gnu/libnss_files-2.15.so 
b7168000  4K rw--- /lib/i386-linux-gnu/libnss_files-2.15.so 
b7169000  88K r-x-- /lib/i386-linux-gnu/libnsl-2.15.so 
b717f000  4K r---- /lib/i386-linux-gnu/libnsl-2.15.so 
b7180000  4K rw--- /lib/i386-linux-gnu/libnsl-2.15.so 
b7181000  8K rw--- [ anon ] 
b7183000  28K r-x-- /lib/i386-linux-gnu/libnss_compat-2.15.so 
b718a000  4K r---- /lib/i386-linux-gnu/libnss_compat-2.15.so 
b718b000  4K rw--- /lib/i386-linux-gnu/libnss_compat-2.15.so 
b71a1000  4K r---- /usr/lib/locale/locale-archive 
b71a2000 1428K r---- /usr/lib/locale/locale-archive 
b7307000 2048K r---- /usr/lib/locale/locale-archive 
b7507000  4K rw--- [ anon ] 
b7508000 1676K r-x-- /lib/i386-linux-gnu/libc-2.15.so 
b76ab000  8K r---- /lib/i386-linux-gnu/libc-2.15.so 
b76ad000  4K rw--- /lib/i386-linux-gnu/libc-2.15.so 
b76ae000  16K rw--- [ anon ] 
b76b2000  12K r-x-- /lib/i386-linux-gnu/libdl-2.15.so 
b76b5000  4K r---- /lib/i386-linux-gnu/libdl-2.15.so 
b76b6000  4K rw--- /lib/i386-linux-gnu/libdl-2.15.so 
b76b7000 112K r-x-- /lib/i386-linux-gnu/libtinfo.so.5.9 
b76d3000  8K r---- /lib/i386-linux-gnu/libtinfo.so.5.9 
b76d5000  4K rw--- /lib/i386-linux-gnu/libtinfo.so.5.9 
b76d8000  28K r--s- /usr/lib/i386-linux-gnu/gconv/gconv-modules.cache 
b76df000  40K r-x-- /lib/i386-linux-gnu/libnss_nis-2.15.so 
b76e9000  4K r---- /lib/i386-linux-gnu/libnss_nis-2.15.so 
b76ea000  4K rw--- /lib/i386-linux-gnu/libnss_nis-2.15.so 
b76eb000  8K rw--- [ anon ] 
b76ed000  4K r-x-- [ anon ] 
b76ee000 128K r-x-- /lib/i386-linux-gnu/ld-2.15.so 
b770e000  4K r---- /lib/i386-linux-gnu/ld-2.15.so 
b770f000  4K rw--- /lib/i386-linux-gnu/ld-2.15.so 
bfbbf000 132K rw--- [ stack ] 
total  7152K 

Chúc nó sẽ giúp đỡ cho bạn.

+0

Đã phải chạy một chương trình thông qua GDB để giữ cho nó sống đủ lâu, nhưng pmap Làm công việc. Cảm ơn! – dhardy

Các vấn đề liên quan