2010-02-02 42 views
28

Tôi cần phải tìm hiểu xem quá trình unix nào của thư viện đã được tải và có thể sử dụng trong suốt thời gian tồn tại của nó. Đây có phải là có thể, và như thế nào. Hoặc tốt hơn, tôi có một tên thư viện và tôi cần phải tìm hiểu những gì các quá trình đang sử dụng nó, là điều này có thể.Lấy danh sách các thư viện đã sử dụng bằng một tiến trình đang chạy (unix)

Trên cùng một lưu ý, có thể nhận được thông báo về cách thức khi một quá trình unix được khởi chạy và khi quá trình này được thoát. Họ sẽ không phải là quá trình con của quá trình của tôi, tôi chỉ cần biết trên toàn cầu.

Cập nhật:

Tôi nghĩ rằng tôi đã không đưa ra đầy đủ thông tin. Các unix tôi đã nói về là MacOS X (mặc dù một số người nói nó không thực sự hoàn toàn unix), và tôi đã tìm kiếm một cách để tìm các thư viện nạp một quá trình có và tôi cần phải làm điều đó trong C/C + +.

Trả lời

5

bạn có thể sử dụng lsof. Xem trang người đàn ông để biết thêm thông tin. Công cụ khác là strace. Để xem quy trình có được khởi chạy hay không, bạn có thể sử dụng ps -ef được gửi đến grep hoặc các công cụ như pgrep. kiểm tra giá trị trả lại để biết liệu nó có thoát hay không.

11

nếu lsof không được cài đặt, bạn có thể chỉ đơn giản là cat/proc/$ pid/maps

bạn cũng có thể kiểm tra trên thực thi đĩa với ldd để xem những gì libs họ sẽ mở ra (nhưng điều đó không hiển thị các thư viện mở tự động sử dụng dlopen()).

Để theo dõi các quy trình mới, bạn có thể thêm một đồng hồ inotify vào/proc để theo dõi việc tạo/hủy các thư mục chỉ số mới.

Cập nhật: inotify on/proc không hoạt động, nhưng có vẻ như giải pháp thay thế, xem this thread

39

Solaris có pldd. Đối với Linux, bạn có thể gọi ldd trên tệp thực thi hoặc pmap trên quy trình đang chạy hoặc xem /proc/PID/maps đối với thư viện được ánh xạ.

+1

'pldd' đã được thêm vào Linux vào tháng 3 năm 2012. [thông báo phát hành glibc 2.15] (http://savannah.gnu.org/forum/forum.php?forum_id=7163) – Mikel

+0

Điều cần biết, cảm ơn. –

+5

Đối với Mac OS X ['otool -L'] (http://developer.apple.com/library/mac/#documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html) tương đương với' ldd' –

2

Tôi đang cố gắng (và không thực hiện) để thực hiện việc này. Nhìn vào mach_vm_read và vm_region_recurse_64. Các ứng dụng nguồn đóng như vmmap và Crash Reporter của Apple làm điều này cũng sử dụng các phương thức đó, cũng như GDB nguồn mở. Bạn có thể thử tìm kiếm câu trả lời ở đó, nhưng nguồn là khó đọc.

8

Trên Mac OS X, bạn có thể sử dụng vmmap $pid để nhận danh sách vùng bộ nhớ được ánh xạ cho một quy trình. Điều này cho thấy tất cả các thư viện được tải (ít nhất nó hoạt động cho tôi ở đây trên 10.7.5).

ps -A sẽ cung cấp cho bạn danh sách tất cả các quy trình, vì vậy ps -A | grep $APPNAME sẽ giúp bạn nhận được id quá trình $ pid để sử dụng với vmmap $pid. lsof -p $pid cũng hoạt động.

Câu hỏi dường như yêu cầu một phương pháp động từ C++. Bạn có thể thăm dò ý kiến ​​với các lệnh này và phân tích kết quả, mặc dù bạn có thể bỏ lỡ các sự kiện tải/dỡ nhanh.

lsof là phần mềm nguồn mở theo giấy phép BSD. Mã nguồn của nó không có nghi ngờ cung cấp một số thông tin chi tiết về cách làm điều này từ C/C++. Xem: http://en.wikipedia.org/wiki/Lsof

0

Tôi không có câu trả lời cụ thể mà bạn đang tìm kiếm, nhưng tôi có thứ gì đó gần gũi, có thể sẽ giúp bạn gần gũi với những gì bạn muốn.Bạn có thể hiển thị các thư viện liên kết của một số nhị phân (không xử lý) cụ thể bằng cách:

  1. cài đặt xcode https://developer.apple.com/xcode/
  2. thực hiện: otool -L PATH_TO_BINARY

VÍ DỤ:

chris$ otool -L /usr/local/bin/mtr 
mtr: 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) 
    /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 46.1.0) 
3

On OS X, chỉ cần đặt DYLD_PRINT_LIBRARIES

export DYLD_PRINT_LIBRARIES=1 
./your_process 
Các vấn đề liên quan