23

我想使用 gprof 来分析一个守护进程。我的守护进程使用一个 3rd 方库,它注册一些回调,然后调用一个main永远不会返回的函数。我需要调用kill(SIGTERM 或 SIGKILL)来终止守护进程。不幸的是,gprof 的手册页说:

分析程序必须调用“exit”(2) 或正常返回,以便将分析信息保存在 gmon.out 文件中。

有没有办法保存被 SIGTERM 或 SIGKILL 杀死的进程的分析信息?

4

2 回答 2

32

首先,我要感谢@wallyk 给了我很好的初步指导。我解决了我的问题如下。显然,libc 的 gprof 退出处理程序被称为_mcleanup. 因此,我为 SIGUSR1 注册了一个信号处理程序(第 3 方库未使用)并调用_mcleanupand _exit。完美运行!代码如下所示:

#include <dlfcn.h>
#include <stdio.h>
#include <unistd.h>

void sigUsr1Handler(int sig)
{
    fprintf(stderr, "Exiting on SIGUSR1\n");
    void (*_mcleanup)(void);
    _mcleanup = (void (*)(void))dlsym(RTLD_DEFAULT, "_mcleanup");
    if (_mcleanup == NULL)
         fprintf(stderr, "Unable to find gprof exit hook\n");
    else _mcleanup();
    _exit(0);
}

int main(int argc, char* argv[])
{
    signal(SIGUSR1, sigUsr1Handler);
    neverReturningLibraryFunction();
}
于 2012-04-18T13:10:23.297 回答
9

您可以为第三方库未捕获或忽略的信号添加信号处理程序。可能 SIGUSR1 已经足够好,但要么必须进行试验,要么阅读库的文档——如果它足够彻底的话。

您的信号处理程序可以简单地调用exit().

于 2012-04-18T08:46:31.253 回答