返回博客

如何查看 Mac 上进程加载的模块和动态库

详解五种方法查看 macOS 进程加载的动态库(dylib)和框架——vmmap、otool、lsof、dyld_info 以及 ProcXray 可视化模块检查工具。

每个 macOS 应用在运行时都会加载动态库(dylib)和框架。查看这些已加载的模块可以帮助你调试链接问题、审查第三方依赖、检测注入的库,以及理解应用的内部架构。本文介绍五种方法来检查进程加载了哪些模块——从内置命令行工具到专用的图形化应用。

快速结论

在终端中执行 vmmap <pid> | grep '\.dylib' 即可列出运行中进程加载的所有动态库。若要查看静态链接依赖,可使用 otool -L /path/to/binary。如需可视化、可搜索的界面,一键查看已加载模块的文件路径、版本和 UUID,可使用 ProcXray

macOS 上的”已加载模块”是什么?

已加载模块是指 macOS 动态链接器(dyld)在运行时映射到进程地址空间中的动态库(.dylib)、框架(.framework)或 Bundle(.bundle)。它们分为两类:

macOS 系统进程通常加载 100–300 个模块,而 Xcode 或 Chrome 等复杂应用可能加载超过 1,000 个。了解加载了哪些模块对于诊断崩溃、定位版本冲突和安全审计至关重要。

方法一:vmmap — 列出运行中进程的所有已加载模块

vmmap 命令显示运行中进程的虚拟内存区域。由于每个加载的 dylib 都占用独立的内存区域,你可以过滤输出来查看当前内存中的所有模块。

# 按 PID 列出运行中进程的所有已加载 dylib
vmmap <pid> | grep '\.dylib'

先找到 PID:

# 查找 Safari 的 PID
pgrep -x Safari

示例输出:

__TEXT   7FF80B2A0000-7FF80B2C1000  r-x/r-x  /usr/lib/system/libsystem_kernel.dylib
__TEXT   7FF80B2C1000-7FF80B2FD000  r-x/r-x  /usr/lib/system/libsystem_c.dylib
__TEXT   7FF80B300000-7FF80B365000  r-x/r-x  /usr/lib/libobjc.A.dylib

每行显示内存地址范围、权限和已加载库的完整路径。

同时包含框架:

# 显示所有已加载的 dylib 和框架
vmmap <pid> | grep -E '\.(dylib|framework)/'

统计已加载模块数量:

vmmap <pid> | grep '\.dylib' | awk '{print $NF}' | sort -u | wc -l

何时使用 vmmap

当你需要查看运行中进程实际加载到内存中的所有内容时使用 vmmap,包括 otool 无法显示的运行时加载模块。进程必须处于运行状态,检查系统进程可能需要提升权限。

方法二:otool -L — 查看静态链接依赖

otool 命令用于检查 Mach-O 二进制文件。-L 参数列出二进制文件在编译时链接的所有动态库。

# 列出应用程序二进制文件的链接库
otool -L /Applications/Safari.app/Contents/MacOS/Safari

示例输出:

/Applications/Safari.app/Contents/MacOS/Safari:
    /System/Library/Frameworks/WebKit.framework/Versions/A/WebKit
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit
    /usr/lib/libSystem.B.dylib
    /usr/lib/libc++.1.dylib

这显示了二进制文件预期加载的库——即编译时依赖。它不会显示通过 dlopen() 在运行时加载的库。

查看某个 dylib 自身的依赖:

otool -L /usr/lib/libobjc.A.dylib

何时使用 otool

当你想在运行程序之前了解二进制文件应该加载什么时使用 otool -L。这对于验证构建配置、确认链接了正确的 SDK 框架以及检测缺失的依赖项非常有用。

方法三:lsof — 通过打开的文件查找已加载的库

lsof 命令列出进程打开的所有文件。由于已加载的库是内存映射文件,它们会出现在 lsof 的输出中。

# 列出进程加载的所有 .dylib 文件
lsof -p <pid> | grep '\.dylib'

包含框架:

lsof -p <pid> | grep -E '\.(dylib|framework)'

何时使用 lsof

当你需要快速检查并且已经熟悉该工具时使用 lsof。但 vmmap 能提供更详细的信息(内存地址、权限),是模块检查的首选工具。

方法四:dyld_info — 检查动态链接器

从 macOS 12(Monterey)开始,Apple 提供了 dyld_info 命令用于检查动态链接器信息。

# 显示二进制文件的所有依赖 dylib
dyld_info -dependents /Applications/Safari.app/Contents/MacOS/Safari

查看动态链接器共享缓存的使用情况:

# 列出平台和依赖信息
dyld_info -platform -dependents /usr/lib/libobjc.A.dylib

何时使用 dyld_info

当你需要关于动态链接器行为的详细信息(包括平台要求和依赖链)时使用 dyld_info。与 otool 相比,它在依赖分析方面提供更简洁的输出。

方法五:ProcXray — 可视化模块检查器

ProcXray 提供专用的 Modules(模块) 选项卡,可显示任何运行中进程的所有已加载模块——无需记忆命令,无需解析输出。

如何使用 ProcXray 检查模块

  1. 启动 ProcXray。
  2. 从进程列表中选择一个进程(使用搜索栏或树视图查找)。
  3. 点击详情面板中的 Modules 选项卡。
  4. 浏览已加载的 dylib 和框架完整列表,包含文件路径和详细信息。

使用 Modules 选项卡中的搜索栏按库名称过滤——例如输入”libsystem”查找所有已加载的系统库,或输入”swift”定位 Swift 运行时模块。

ProcXray Modules 选项卡展示进程已加载的库及搜索过滤功能

ProcXray 相比命令行工具的优势

方法对比

功能vmmapotool -Llsofdyld_infoProcXray
显示运行时加载的模块支持不支持支持不支持支持
显示静态依赖不支持支持不支持支持不支持
需要进程正在运行
内存地址信息支持不支持不支持不支持不支持
搜索/过滤手动(grep)手动(grep)手动(grep)不支持内置
易用性中等简单中等简单最简单
macOS 版本要求全部全部全部12+14+

实用场景

调试与缺失或错误库版本相关的崩溃

# 检查是否加载了预期版本的库
vmmap <pid> | grep 'libssl'

如果输出指向与预期不同的 libssl(例如 Homebrew 版本而非系统版本),你就找到了版本冲突的原因。

审计应用是否存在注入的库

安全研究人员和开发者可以检查是否有意外的库被加载到进程中:

# 查找不来自 /System 或 /usr/lib 的库
vmmap <pid> | grep '\.dylib' | grep -v '/System/' | grep -v '/usr/lib/'

任何结果都可能表明存在第三方注入、插件或值得调查的自定义框架。

检查应用是否使用了特定框架

# 这个应用使用了 SwiftUI 吗?
vmmap <pid> | grep 'SwiftUI'

# 它是否链接了 Metal?
otool -L /path/to/binary | grep 'Metal'

常见问题(FAQ)

macOS 上 dylib 和 framework 有什么区别?

.dylib 是一个独立的动态库文件。.framework 是一个 Bundle 目录,包含 dylib 及其头文件、资源和元数据。框架是 Apple 系统库和第三方 SDK 的标准打包格式。在运行时,两者都由 dyld 以相同的方式加载。

不用终端能查看运行中应用加载了哪些 dylib 吗?

可以。ProcXray 让你选择任何运行中的进程,通过图形界面和内置搜索查看其已加载的模块,无需使用任何终端命令。

为什么一个进程会加载几百个库?

macOS 大量依赖动态链接。即使是用 Swift 编写的简单”Hello World”应用也会加载 100 多个模块,因为 Swift 运行时、Foundation 框架和核心系统库各自都会引入自己的依赖。这是正常现象,也是设计使然——共享库减少了整个系统的内存使用。

otool -L 能显示进程将要加载的所有内容吗?

不能。otool -L 只显示编译时链接依赖。通过 dlopen() 在运行时加载的库——如插件、可选功能和延迟加载的组件——不会被显示。使用 vmmap 查看运行中的进程可以获得完整的全貌。

检查其他进程的模块需要 sudo 吗?

对于自己的进程不需要。对于系统进程或其他用户拥有的进程,使用 vmmaplsof 时可能需要 sudo。ProcXray 会在首次启动时提示授予必要的 macOS 权限。

参考资料

下载 ProcXray → — 免费,支持 macOS Sonoma 及以上版本。