dtrace 将在将来运行的用户进程

Posted

技术标签:

【中文标题】dtrace 将在将来运行的用户进程【英文标题】:dtrace a user process which will run in future 【发布时间】:2015-11-05 19:03:50 【问题描述】:

有一个用户进程 1 可以“执行”第二个进程 2。当我不知道何时创建第二个 process-2 时,我可以 dtrace 吗?在不知道 pid 且不想手动执行进程的情况下,我不能在 dtrace 脚本中同时使用“-p”和“-c”选项。

使用 PID 提供程序时出现命名空间错误(函数不属于进程 1)。我试过 "::functio_name:entry /execname == "process-2"/ ,但这不能为用户空间程序编译。

感谢任何指点。

【问题讨论】:

【参考方案1】:

我认为post 可以帮助您。你需要2DTrace 脚本:

(1) 第一个脚本用于跟踪process-2 的启动时间。一旦它开始运行,启动另一个脚本来跟踪process-2

# cat followfork.d
proc:::start
/ppid == $target/

    stop();
    printf("fork %d\\n", pid);
   system("dtrace -qs child.d -p %d", pid);

(2) 第二个脚本跟踪焦点函数:

# cat child.d
pid$target::function_name:entry

    ......

您也可以参考DTrace邮件列表中的相关讨论:How to trace libc module of both parent andchild processes?When a process is stopped by stop() action, when and how does the process is restarted?

顺便说一句,您还可以参考 Sergey Klyaus 的 Dynamic Tracing with DTrace & SystemTap 来检查应该在进程创建中使用哪些探针:

【讨论】:

以上是关于dtrace 将在将来运行的用户进程的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dtrace 进行挂钟分析?或者,如何使用配置文件提供程序计算进程未运行的样本?

使用 dtrace 分析 C 代码

FreeBSD 用户空间 DTrace 和用户空间的转储函数参数

如何编写 dtrace 脚本来转储 Solaris 10 上崩溃进程的堆栈?

如何使用 dtrace 显示每个进程消耗的微秒 cpu?

如何使用 dtrace 确定进程的最大内存使用量