2010-02-02 37 views
28

我需要找出哪些庫是unix進程已加載並可能在整個生命週期中使用的。這是可能的和如何。或者更好的是,我有一個庫名稱,我需要找出哪些進程正在使用它,這是可能的。通過正在運行的進程獲取已使用庫的列表(unix)

在同樣的說明中,是否有可能通知某些unix進程何時啓動以及何時退出。他們不會是我的過程的子進程,我只需要全球知道。

更新:

我覺得我沒有提供足夠的信息。我所談論的unix是MacOS X(即使有人說它不是完全unix),我正在尋找一種方法來找到一個進程已加載的庫,我需要用C/C++來完成。

回答

5

您可以使用lsof。請參閱手冊頁獲取更多信息。另一個工具是strace。要查看是否啓動了一個進程,您可以使用ps -ef管道到grep,或者使用pgrep等工具。檢查返回值是否知道它是否退出。

11

如果沒有安裝lsof的,你可以簡單地執行cat/proc/$ PID /映射

,你也可以檢查磁盤上的可執行文件與LDD,看看他們會開什麼庫(但是,這並不表明圖書館開通動態使用dlopen())。

至於監視新進程,您可能會在/ proc中添加inotify監視來監視新的僅限數字的目錄的創建/銷燬。

更新:inotify的上/ proc中不工作,但也有明顯的替代品,看this thread

39

Solaris提供了pldd。對於Linux,您可以在正在運行的進程上調用ldd或在可執行文件上調用pmap,或者在/proc/PID/maps中查找映射的庫。

+1

'pldd'已於2012年3月加入Linux。[glibc 2.15發佈公告](http://savannah.gnu.org/forum/forum.for/forum_id=7163) – Mikel 2012-04-05 20:49:36

+0

很高興知道,謝謝。 – 2012-04-05 21:33:16

+5

對於Mac OS X ['otool -L'](http://developer.apple.com/library/mac/#documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html)相當於'ldd' – 2013-04-03 08:12:48

2

我試圖(和失敗)也這樣做。看看mach_vm_read和vm_region_recurse_64。像vmmap和Apple的Crash Reporter這樣的閉源應用程序也可以使用這些方法以及開源的GDB。你可能會嘗試在那裏尋找答案,但來源有挑戰性的閱讀。

8

在Mac OS X上,您可以使用vmmap $pid獲取進程的映射內存區域列表。這確實顯示了所有已加載的庫(至少它對我來說適用於10.7.5)。

ps -A會給你一個所有進程的列表,所以ps -A | grep $APPNAME會給你你的進程ID $ pid與vmmap $pid一起使用。 lsof -p $pid也適用。

這個問題似乎是要求從C++的動態方法。您可以使用這些命令進行輪詢並分析結果,但您可能會錯過快速加載/卸載事件。

lsof是BSD許可下的開源軟件。它的源代碼無疑提供了一些有關如何從C/C++執行此操作的見解。請參閱:http://en.wikipedia.org/wiki/Lsof

0

我沒有具體的答案,你正在尋找,但我有一些接近,這可能會讓你接近你想要的東西。您可以顯示一個特定的二進制(未加工)的鏈接庫:

  1. 安裝的Xcode https://developer.apple.com/xcode/
  2. 執行:otool -L PATH_TO_BINARY

例:

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

在OS X,只需設置DYLD_PRINT_LIBRARIES

export DYLD_PRINT_LIBRARIES=1 
./your_process 
相關問題