OS没有linux的strace,但它的dtrace应该要好得多。
但是,我很怀念对单个命令进行简单跟踪的能力。例如,在linux上,我可以编写strace -f gcc hello.c来捕获所有系统调用,这给出了编译器编译我的程序所需的所有文件名列表(优秀的memoize脚本就是基于这个技巧构建的)。
我想在mac上移植memoize,所以我需要一些strace。我实际需要的是gcc读取和写入的文件列表,所以我需要更多的truss。当然,我可以说dtruss -f gcc hello.c并获得一些相同的功能,但是编译器是以根权限运行的,这显然是不可取的(除了巨大的安全风险,一个问题是a.out文件现在归根用户所有:-)
然后我尝试了dtruss -f sudo -u myusername gcc hello.c,但感觉有点不对劲,而且无论如何都不能工作(我一直没有得到a.out文件,不知道为什么)
发布于 2011-01-15 20:16:04
不是对你问题的回答,而是一些需要知道的事情。OpenSolaris用“特权”(见this page )(部分)解决了这个问题。即使在OpenSolaris中,也不可能允许用户在没有任何额外特权的情况下破坏他们自己的进程。原因在于dtrace的工作方式--它在内核中启用探测。因此,允许非特权用户探测内核意味着用户可以做许多不想要的事情,例如通过在键盘驱动程序中启用探测来嗅探其他用户的密码!
发布于 2012-07-29 10:46:51
最简单的方法是使用sudo:
sudo dtruss -f sudo -u $USER whoami其他解决方案是首先运行调试器,然后监视新的特定进程。例如。
sudo dtruss -fn whoami然后在另一个终端中只需运行:
whoami就这么简单。
你可以在手册中找到更多微妙的论点:man dtruss
或者,您可以将dtruss附加到正在运行的用户进程,例如在Mac上:
sudo dtruss -fp PID或者在Linux/Unix上使用strace:
sudo strace -fp PID另一个棘手的技巧可能是执行命令,然后立即附加到进程。下面是一些示例:
sudo true; (./Pages &); sudo dtruss -fp `pgrep -n -x Pages`
sudo true; (sleep 1 &); sudo dtruss -fp `pgrep -n -x sleep`
sudo true; (tail -f /var/log/system.log &); sudo dtruss -fp `pgrep -n -x tail`注意:
ls, date这样的快速命令行,因为它需要一些时间才能将调试器附加到进程,&要在后台运行进程,如果它已经在执行此操作,发布于 2014-01-03 05:28:11
dtruss的-n参数将导致dtruss等待并检查与-n参数匹配的进程。-f选项仍然可以跟踪从-n匹配的进程派生的进程。
所有这些都意味着,如果您想dtruss一个以非特权用户身份运行的进程(为了便于讨论,假设它是whoami),请执行以下步骤:
dtruss -fn whoami ”的进程执行shell
whoami
这个答案复制了@kenorb回应的后半部分,但它值得成为一流的答案。
https://stackoverflow.com/questions/3007868
复制相似问题