2010-02-02 56 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 
相关问题