如何在Mac OS X中跟踪程序的系统调用

Mic*_*ald 37 macos strace

我想跟踪find命令发出的系统调用来调试一些性能问题但是我无法弄清楚如何在Mac OS X Yosemite上执行此操作.我如何跟踪任意程序的系统调用,类似于FreeBSD上的strace?我对跟踪文件系统相关的调用特别感兴趣.

jsp*_*cal 32

你可以像使用dtruss一样使用

sudo dtruss find ~/repo -depth 2 -type d -name '.git'
Run Code Online (Sandbox Code Playgroud)

该实用程序的手册页将帮助您根据需要定制工具的使用.

  • dtruss确实工作了(15年6月),但被El Capitan的系统完整性保护制度打破了. (15认同)
  • 可以禁用SIP https://developer.apple.com/library/content/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html (3认同)
  • @Olsonist dtrace的问题:当前的安全限制(启用了无根)阻止dtrace附加到未使用[com.apple.security.get-task-allow]权利签名的可执行文件。 (2认同)
  • 另请参阅/sf/ask/2343350271/ (2认同)
  • @CharlieParker strace 仅适用于 Linux。 (2认同)
  • 此答案失败:``` dtrace:系统完整性保护已打开,某些功能将不可用 dtrace:执行查找失败:不允许操作``` (2认同)

dus*_*uff 30

在当前版本的macOS下,/usr/bin无法跟踪SIP(如)所涵盖的路径下的可执行文件.

您可以通过在主目录中复制可执行文件并跟踪副本来绕过此问题:

cp /usr/bin/find find
sudo dtruss ./find …
Run Code Online (Sandbox Code Playgroud)

  • 不适用于 macOS 10.15.4。必须首先执行“codesign --remove-signature ./find”。 (14认同)
  • 删除签名后,MacOs 不会执行该程序。我收到类似“无法打开此程序,源不受信任”的错误 (3认同)
  • 可能我的错误确实与 SIP 相关,所以这也是成功的。 (2认同)
  • 确实对我有用,我收到此错误: ``` dtrace: 执行失败。/find: 无法为任务创建符号器 ``` (2认同)

sen*_*ngi 9

你可能会有更好的运气ktrace。例如(在索诺玛 14.0 上):

sudo ktrace trace -S -f C3 -c find .
Run Code Online (Sandbox Code Playgroud)

-f= 过滤器描述,C3= 类 3 = DBG_FSYSTEM, -S= 尽可能将参数打印为字符串。

在优胜美地,它会是这样的sudo ktrace -t cin -c find .

更多ktrace过滤器示例请参见/sf/answers/5389135881/