如何正确处理信号,以便gperftools CPU Profiler仍然有效?

时间:2013-10-25 05:52:45

标签: c++ multithreading signals profiler gperftools

我想描述一下我的守护程序,它会暂停主线程:

sigset_t signal_mask;
sigemptyset(&signal_mask);
sigaddset(&signal_mask, SIGTERM);
sigaddset(&signal_mask, SIGINT);

int sig;
sigwait(&signal_mask, &sig);

所有其他线程只是阻止所有信号。 据我所知,探查器使用SIGPROF信号进行操作。如果我使用这样的代码开始分析,则输出.prof文件为空:

  

env CPUPROFILE = daemon.prof ./daemon

如何正确处理主线程和其他线程中的信号以启用性能分析?或者可能是其他地方的问题?

2 个答案:

答案 0 :(得分:1)

  

所有其他线程只是阻止所有信号。

您只需要在所有线程(或您要分析的线程)中取消阻止SIGPROF。我们只是在多线程守护进程中解决完全相同的问题。

答案 1 :(得分:0)

我需要查看更多代码,但是您的声明“所有其他线程只是阻止所有信号”会引发...信号。

您必须记住,大多数系统调用是在线程概念存在之前创建的。信号处理就是其中之一。因此,当您阻止任何线程上的信号时,它可能会阻塞所有线程。

事实上,请查看signal(2)联机帮助页:

The effects of signal() in a multithreaded process are unspecified.

是的,这很难过,但这是使用低开销统计抽样分析器必须支付的价格。并且解决它非常简单:只需从信号掩码集中删除SIGPROF(如果使用REAL模式,则删除SIGALRM),你应该没问题。

一般情况下,除非你必须这样做,否则你不应该在主线程以外的任何东西中进行进程级别的信号屏蔽......其中“main”并不一定意味着MAIN()正在运行的线程在你看来,你认为是所有其他人的“老板”,因为你已经把它弄得太清楚了。 :)

您也可以尝试使用pthread library's sigmask wrapper pthread_sigmask,,但我不清楚它在子线程中移除sigmask中的条目(pthreads继承其父级的pthread sigmask)等情况下的效果如何。