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