杀死一个过程之前保存是gmon.out(Saving gmon.out before killing

2019-06-23 17:30发布

我想用gprof的剖析一个守护进程。 我的守护程序使用第三方库,用它注册了一些回调,然后调用一个main功能,即永远不会返回。 我需要调用kill (无论是SIGTERM或SIGKILL)终止该守护程序。 不幸的是,gprof的手册页说以下内容:

异形程序必须调用“退出”(2)或常才能将其保存在文件是gmon.out的分析信息返回。

是否有办法救分析信息:这是死于SIGTERM或SIGKILL流程?

Answer 1:

首先,我要感谢@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();
}


Answer 2:

你可以添加的信号处理程序的信号第三方库不会赶上或忽视。 也许SIGUSR1是不够好,但将不得不实验或阅读库的文档,如果不够彻底。

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



文章来源: Saving gmon.out before killing a process
标签: linux gprof