我想跟踪由 find 命令进行的系统调用以调试一些性能问题,但是我不知道如何在 Mac OS X Yosemite 上执行此操作。如何与 FreeBSD 上的 strace 类似地跟踪任意程序的系统调用?我对跟踪文件系统相关的调用特别感兴趣。
建议的接受的答案对我不起作用。这是我尝试过的:
cd ~
cp /usr/bin/find find
codesign --remove-signature ./find
sudo dtruss ./find …
错误:
codesign --remove-signature ./find
sudo dtruss ./find
dtrace: system integrity protection is on, some features will not be available
dtrace: failed to execute ./find: Could not create symbolicator for task
在当前版本的 macOS 下,无法跟踪 SIP 覆盖的路径下的可执行文件(如
/usr/bin
)。
您可以通过在主目录中创建可执行文件的副本并跟踪该副本来绕过此问题:
cp /usr/bin/find find
codesign --remove-signature ./find
sudo dtruss ./find …
您需要从新的
find
可执行文件中删除代码签名,否则 SIP 仍然会注意到系统文件正在被访问(来源:@Anmol Singh Jaggi)。
您可能会拥有更好的运气
ktrace
。例如:
sudo ktrace trace -S -f C3 -c find .
-f
= 过滤器描述,C3
= 类 3 = DBG_FSYSTEM
,-S
= 打印字符串参数。
更多
ktrace
过滤器示例见 https://stackoverflow.com/a/76987655.