通过正在运行的进程获取已使用库的列表(unix)

Ale*_*hen 30 unix macos process

我需要找出unix进程加载的库以及可能在整个生命周期中使用的库.这有可能吗?或者更好的是,我有一个库名,我需要找出使用它的进程,这是可能的.

同样,是否可以通知unix进程何时启动以及何时退出.它们不是我流程的子流程,我只需要全局了解.

更新:

我想我没有提供足够的信息.我正在谈论的unix是MacOS X(即使有人说它并不是真正完全unix),我正在寻找一种方法来找到一个进程所加载的库,我需要用C/C++来完成它.

Nik*_*sov 41

Solaris有pldd.对于Linux,您可以调用ldd可执行文件或pmap正在运行的进程,或查看/proc/PID/maps映射库.

  • 对于Mac OS X [`otool -L`](http://developer.apple.com/library/mac/#documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html)相当于`ldd` (6认同)

ggi*_*oux 11

如果没有安装lsof,你可以简单地使用cat/proc/$ pid/maps

您还可以使用ldd检查磁盘可执行文件,以查看它们将打开哪些库(但不显示使用dlopen()动态打开的库).

至于监视新进程,您可以在/ proc上添加一个inotify监视来监视新的仅数字目录的创建/销毁.

更新:/ proc上的inotify不起作用,但显然有替代方案,请参阅此主题


Con*_* Ma 10

在OS X上,只需要设置 DYLD_PRINT_LIBRARIES

export DYLD_PRINT_LIBRARIES=1
./your_process
Run Code Online (Sandbox Code Playgroud)


Ros*_*ina 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


gho*_*g74 5

你可以使用lsof.有关详细信息,请参见手册页.另一个工具是strace.要查看是否启动了流程,您可以使用ps -ef管道grep或类似工具pgrep.检查返回值以了解是否退出.