我正在编写一个工具,通过调用DTrace跟踪用户指定的程序。
如果我的工具使用dtrace -c运行程序作为DTrace的子进程,则既无法向程序传递任何参数,而且该程序将以DTrace的所有特权(即root身份)运行(我在Mac OS X上)。这会导致某些应该工作的功能出现问题,并且显然使许多不应该工作的东西成为可能。
我知道的另一种解决方案是自己启动程序,通过发送SIGSTOP
暂停它,将其PID传递给dtrace -p
,然后通过发送SIGCONT
继续它。问题在于,要么程序在未被跟踪的情况下运行几秒钟,而DTrace收集符号信息,要么如果我在继续进程之前睡眠几秒钟,DTrace会抱怨objc<pid>:<class>:<method>:entry
没有匹配探针。
有没有办法以用户的帐户身份运行程序,而不是作为root,但仍然可以让DTrace从一开始就能够跟踪它?