我需要找出进程已加载哪些库以及在其整个生命周期中可能使用哪些库。这是否可能以及如何实现。或者更好的是,我有一个库名称,我需要找出哪些进程正在使用它,这可能吗?
同样,当 unix 进程启动和退出时,是否有可能以某种方式收到通知。它们不会是我的进程的子进程,我只需要全局了解。
更新:
我认为我没有提供足够的信息。我正在寻找一种方法来查找进程所加载的库,并且我需要在 C/C++ 中执行此操作。
在 OS X 上,只需设置
DYLD_PRINT_LIBRARIES
export DYLD_PRINT_LIBRARIES=1
./your_process
在 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
如果未安装 lsof,您可以简单地 cat /proc/$pid/maps
您还可以使用 ldd 检查磁盘可执行文件以查看它们将打开哪些库(但这不会显示使用 dlopen() 动态打开的库)。
对于监视新进程,您可以在 /proc 上添加 inotify 监视来监视新的仅数字目录的创建/销毁。
更新:/proc 上的 inotify 不起作用,但显然有替代方案,请参阅 此线程
您可以使用lsof。请参阅手册页以获取更多信息。另一个工具是
strace
。要查看进程是否已启动,您可以使用通过管道连接到 ps -ef
的 grep
,或者也可以使用 pgrep
等工具。检查返回值以了解是否退出。
我没有您正在寻找的具体答案,但我有一些接近的答案,也许会让您接近您想要的。 您可以通过以下方式显示特定二进制文件(非进程)的链接库:
示例:
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)
我也在尝试(但失败了)这样做。查看 mach_vm_read 和 vm_region_recurse_64。诸如 vmmap 和 Apple 的崩溃报告器之类的闭源应用程序以及开源 GDB 也使用这些方法来执行此操作。您可以尝试在那里寻找答案,但源代码很难阅读。