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

时间:2010-02-02 14:35:52

标签: macos unix process

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

在同一个注释中,是否可以获得有关何时启动unix进程以及何时退出的通知。它们不是我流程的子流程,我只需要全局了解。

更新

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

7 个答案:

答案 0 :(得分:41)

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

答案 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管道传输到greppgrep等工具。检查返回值以了解是否退出。

答案 5 :(得分:2)

我正在尝试(并且失败)也这样做。查看mach_vm_read和vm_region_recurse_64。像vmmap和Apple的Crash Reporter这样的封闭源应用程序也使用这些方法以及开源GDB。您可能会尝试在那里寻找答案,但是阅读源极具挑战性。

答案 6 :(得分:1)

我没有你想要的具体答案,但我有一些接近的东西,这可能会让你接近你想要的。您可以通过以下方式显示特定二进制文件(非进程)的链接库:

  1. 安装xcode https://developer.apple.com/xcode/
  2. 执行:otool -L PATH_TO_BINARY
  3. 实施例

    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)