Oracle® Solaris Studio 12.4:性能分析器

退出打印视图

更新时间: 2015 年 1 月
 
 

数据收集和信号

信号同时用于时钟分析和硬件计数器分析。SIGPROF 用于所有实验的数据收集。生成信号的周期取决于收集的数据。SIGEMT(在 Solaris 上)或 SIGIO(在 Linux 上)用于硬件计数器分析。溢出间隔取决于要分析的用户参数。任何使用或处理分析信号的用户代码都可能会干扰数据收集。当收集器安装用于分析信号的信号处理程序时,它会设置一个标志来确保系统调用不被中断以传送信号。此设置可能会更改将分析信号用于其他用途的目标程序的行为。

当收集器为分析信号安装其信号处理程序时,它会记住目标是否安装了自己的信号处理程序。收集器还会插入到某些信号处理例程且不允许用户为这些信号安装信号处理程序;它会保存用户的处理程序,就像收集器在启动实验时替换用户处理程序一样。

分析信号由内核中的分析计时器或硬件计数器溢出处理代码提供,或在对 kill(2)、sigsend(2) tkill(2)、tgkill(2)_lwp_kill(2) 系统调用、raise(3C)sigqueue(3C) 库调用或 kill 命令的响应中提供。会随信号提供信号代码,以便收集器能区分源。如果针对分析提供,收集器会处理该代码;如果不是针对分析提供,则会将其提供给目标信号处理程序。

dbx 下运行收集器时,提供的分析信号的信号代码有时会被损坏,此时会当作分析信号是从系统或库调用或某个命令生成的。在这种情况下,会错误地将其提供给用户的处理程序。如果用户处理程序设置为 SIG_DFL,将导致进程的信息转储失败。

在连接到目标进程后调用收集器时,收集器会安装其信号处理程序,但它无法插入到信号处理例程。如果用户代码在连接后安装信号处理程序,则该处理程序会覆盖收集器的信号处理程序,且数据将会丢失。

请注意,包含任一分析信号的信号都可能会使系统调用过早终止。程序必须准备好处理此行为。当 libcollector 安装信号处理程序以进行数据收集时,它会指定重新启动可重新启动的系统调用。但是,类似 sleep(3C) 的某些系统调用会过早返回而不报告错误。

抽样信号和暂停-恢复信号

用户可以将信号指定为抽样信号 (-l) 或暂停-恢复信号 (-y)。建议将 SIGUSR1 或 SIGUSR2 用于此用途,但也可以使用目标未使用的任何信号。

如果进程未将分析信号用于其他用途,则可以使用这些信号,但仅在没有其他信号可用时才能使用这些信号。收集器会插入到某些信号处理例程且不允许用户为这些信号安装信号处理程序;它会保存用户的处理程序,就像收集器在启动实验时替换用户处理程序一样。

如果在连接到目标进程后调用收集器,且用户代码为抽样信号或暂停-恢复信号安装了一个信号处理程序,则这些信号将无法再按指定完成操作。