在杀死进程之前保存gmon.out

时间:2012-04-18 08:21:10

标签: linux gprof

我想使用gprof来配置守护进程。我的守护进程使用第三方库,它使用它来注册一些回调,然后调用永不返回的main函数。我需要调用kill(SIGTERM或SIGKILL)来终止守护进程。不幸的是,gprof的手册页说明了以下内容:

  

配置文件程序必须调用“exit”(2)或正常返回   分析要保存在gmon.out文件中的信息。

是否有办法保存使用SIGTERM或SIGKILL杀死的进程的分析信息?

2 个答案:

答案 0 :(得分:26)

首先,我要感谢@wallyk给我很好的初步指示。我解决了我的问题如下。显然,libc的gprof退出处理程序称为_mcleanup。因此,我为SIGUSR1注册了一个信号处理程序(第三方库未使用),并调用了_mcleanup_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();
}

答案 1 :(得分:7)

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

您的信号处理员只需拨打exit()