【问题标题】:Is there a way for a process to know that dtrace has attached?有没有办法让进程知道 dtrace 已附加?
【发布时间】:2019-04-05 21:26:32
【问题描述】:

我引入了一个环境选项,它在启动时暂停我的进程,以便我可以附加 dtrace(通过 XCode Instruments)并开始分析。然后我必须在进程上按 Enter 键才能开始运行。我想知道是否有办法让我的进程知道 dtrace 已附加,以便它可以在分析器附加后立即开始运行,而不必等待用户输入。 dtrace 附加时,进程中是否设置了信号或内存值?

【问题讨论】:

  • 只有重启进程的信号才有可能做到这一点。设置内存值无济于事,因为如果进程未运行,则无法检查内存。据我所知,没有这样的信号。
  • 进程实际上正在运行,它只是在等待来自标准输入的输入,但它可以在“等待”时轻松检查一些内容。

标签: c macos profiling dtrace


【解决方案1】:

在很多情况下这很有用,因此 DTrace 能够使用-c 选项运行进程本身以强制跟踪立即开始:

   -c     Run  the  specified  command cmd and exit upon its completion.
          If more than one -c option is present on the command line, dtrace
          exits when all commands have exited, reporting the exit status for
          each child process as it terminates. The process-ID of the first
          command is made available to any D programs specified on the command
          line or using the -s option through the $target macro variable.

在 D 脚本中,您可以使用$target 来引用您以-c 启动的进程,例如在探针名称pid$target::malloc:entry 或条件/pid == $target/ 中。

如果由于某种原因不起作用,您所要求的确切机制并不容易做到,因为 DTrace 通常不允许被跟踪的进程可见的副作用。很有创意,我想您可以检查循环中的时间,而不是等待stdin 上的输入,并且在DTrace 脚本中您可以使用destructive action void chill(int nanoseconds)BEGIN 中暂停您的程序阻塞一秒钟左右。然后,您的程序可以检测到自最近一次时钟测量以来超过 1 秒的暂停,并开始运行。

【讨论】:

  • 这会很好,但我正在使用 XCode Instruments 应用程序进行分析。
  • @ViperBailey 我提到的 chill() 方法呢?
【解决方案2】:

由于您正在编写程序并且 dtrace 被设计为非侵入式,因此可能最简单的方法是创建一个文件以用作标志。您可以让程序创建它,也可以仅在您想要进行调试时手动创建它。然后你让程序启动并寻找什么文件,如果它存在,那么它会暂停并监视文件。删除文件后,它将继续,然后您可以让您的 dtrace 脚本或可能同时启动辅助脚本来删除文件。当您不想调试时,您只需不创建文件。当您创建文件并让调试在启动过程中删除该文件时。

【讨论】:

  • 你能举一些代码或原型作为例子吗?
猜你喜欢
  • 2017-12-06
  • 2012-02-17
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 2015-02-13
  • 2010-12-24
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多