我需要找出unix进程加载的库以及可能在整个生命周期中使用的库。这有可能吗?或者更好的是,我有一个库名,我需要找出使用它的进程,这是可能的。
在同一个注释中,是否可以获得有关何时启动unix进程以及何时退出的通知。它们不是我流程的子流程,我只需要全局了解。
更新
我想我没有提供足够的信息。我正在谈论的unix是MacOS X(尽管有人说它并不是完全unix),我正在寻找一种方法来找到一个进程所加载的库,我需要用C / C ++来实现。
答案 0 :(得分:41)
答案 1 :(得分:11)
如果没有安装lsof,你可以简单地使用cat / proc / $ pid / maps
您还可以使用ldd检查磁盘可执行文件以查看它们将打开哪些库(但不显示使用dlopen()动态打开的库)。
至于监视新进程,您可以在/ proc上添加一个inotify监视来监视新数字目录的创建/销毁。
更新:/ proc上的inotify不起作用,但显然有替代方案,请参阅this thread
答案 2 :(得分: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
答案 3 :(得分:8)
在OS X上,只需设置DYLD_PRINT_LIBRARIES
export DYLD_PRINT_LIBRARIES=1
./your_process
答案 4 :(得分:5)
你可以使用lsof。有关详细信息,请参见手册页。另一个工具是strace
。要查看是否已启动流程,您可以使用ps -ef
管道传输到grep
或pgrep
等工具。检查返回值以了解是否退出。
答案 5 :(得分:2)
我正在尝试(并且失败)也这样做。查看mach_vm_read和vm_region_recurse_64。像vmmap和Apple的Crash Reporter这样的封闭源应用程序也使用这些方法以及开源GDB。您可能会尝试在那里寻找答案,但是阅读源极具挑战性。
答案 6 :(得分:1)
我没有你想要的具体答案,但我有一些接近的东西,这可能会让你接近你想要的。您可以通过以下方式显示特定二进制文件(非进程)的链接库:
实施例
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)