log show 无法追踪系统库调用的函数栈,因其仅读取统一日志中进程主动写入的结构化日志,不捕获运行时函数调用链;替代方案为 instruments 的 system trace、sample/spindump 或 lldb 调试。
log show 无法追踪系统库调用的函数栈。
原因很直接
log 命令读取的是 macOS 统一日志(Unified Logging)数据库中的结构化日志条目,这些日志由进程主动写入,内容取决于开发者是否调用了 os_log、NSLog 或系统服务自动上报的事件。它不捕获函数调用过程本身,更不会记录动态链接库(如 libsystem、libobjc、CoreFoundation)内部的函数进入/退出、调用链或堆栈帧。
函数栈属于运行时执行流信息,需在内核或用户态进行实时采样或插桩,log 系统既无此能力,也未设计为此类低层可观测性服务。
能替代的原生工具
若你真正需要查看某进程调用系统库函数时的实际栈回溯(例如:哪个线程在调用 malloc、dispatch_sync、CFRunLoopRun),请使用以下 macOS 自带方案:
- Instruments → System Trace:可完整捕获用户态和内核态的函数调用链,支持按 dylib 过滤,显示符号化栈(需有 dSYM 或系统符号),还能关联到系统调用、锁竞争、I/O 等事件。
-
sample 或 spindump:对运行中进程做周期性栈采样。例如:
sample -file out.trace PID 10(采样 10 秒),输出含每一帧的函数名、二进制模块与偏移,对系统库调用识别度高。 -
lldb 调试时设置 symbolication:附加到进程后,用
bt查看当前线程栈;配合image list和settings set target.symbol-search-paths可解析系统库符号(需保留系统调试符号或使用 Apple 提供的 SDK 符号)。
log show 能做什么(别误用)
它适合查“谁触发了什么行为”,而非“怎么执行的”。例如:
- 查某个 App 启动时加载了哪些扩展:
log show --predicate 'subsystem == "com.apple.xpc" AND eventMessage contains "launch" - 查 CoreServices 框架报告的沙盒拒绝:
log show --predicate 'subsystem == "com.apple.CoreServices" AND eventMessage contains "deny" - 查安全框架调用失败的权限错误:
log show --predicate 'subsystem == "com.apple.securityd" AND eventMessage contains "errSec"
这些是日志里“写下来的消息”,不是运行时“正在发生的调用”。
小结
想看函数栈,就别用 log show。它不采样、不拦截、不解析执行流——它只查日志。真要追踪系统库调用路径,Instruments 或 sample 是最可靠、无需安装第三方工具的选择。











