【问题标题】:Getting a list of used libraries by a running process (unix)通过正在运行的进程(unix)获取使用的库列表
【发布时间】:2011-01-12 04:32:40
【问题描述】:

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

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

更新:

我想我没有提供足够的信息。我所说的 unix 是 MacOS X(尽管有人说它不是真正完全的 unix),我正在寻找一种方法来查找进程具有的已加载库,并且我需要在 C/C++ 中进行。

【问题讨论】:

    标签: macos unix process


    【解决方案1】:

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

    【讨论】:

    • pldd 于 2012 年 3 月添加到 Linux。glibc 2.15 release announcement
    • 对于 Mac OS X,otool -L 相当于 ldd
    • Linux 的另一个选项:strace -e trace=file YOUR_COMMAND。添加-f,以防您想遵循您的产卵过程。请注意,这将显示所有与文件相关的系统调用,而不仅仅是共享对象。
    【解决方案2】:

    在 OS X 上,只需设置DYLD_PRINT_LIBRARIES

    export DYLD_PRINT_LIBRARIES=1
    ./your_process
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        在 Mac OS X 上,您可以使用 vmmap $pid 获取进程的映射内存区域列表。这确实显示了所有加载的库(至少它在 10.7.5 上对我有用)。

        ps -A 将为您提供所有进程的列表,因此ps -A | grep $APPNAME 将为您提供与vmmap $pid 一起使用的进程ID $pid。 lsof -p $pid 也可以。

        问题似乎是要求 C++ 的动态方法。您可以使用这些命令进行轮询并分析结果,尽管您可能会错过快速加载/卸载事件。

        lsof 是 BSD 许可下的开源软件。它的源代码无疑为如何从 C/C++ 做到这一点提供了一些见解。见:http://en.wikipedia.org/wiki/Lsof

        【讨论】:

          【解决方案5】:

          你可以使用 lsof。有关更多信息,请参见手册页。另一个工具是strace。要查看是否启动了进程,您可以使用ps -ef 管道到grep,或pgrep 之类的工具。检查返回值是否退出。

          【讨论】:

            【解决方案6】:

            我也在尝试(但失败)这样做。查看 mach_vm_read 和 vm_region_recurse_64。 vmmap 和 Apple 的 Crash Reporter 等闭源应用程序也使用这些方法以及开源 GDB 来执行此操作。您可以尝试在那里寻找答案,但来源很难阅读。

            【讨论】:

              【解决方案7】:

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

              1. 安装xcodehttps://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)
              

              【讨论】:

              • 请注意,这不一定会找到进程使用的所有库。这不会找到在运行时通过代码动态加载的库,也不会找到由这些库链接到的其他库。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-25
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多