小编典典

在终止进程之前保存gmon.out

linux

我想使用gprof来分析守护程序。我的守护程序使用第3方库,通过该库注册一些回调,然后调用一个main永不返回的函数。我需要调用kill(SIGTERM或SIGKILL)终止守护程序。不幸的是,gprof的手册页显示以下内容:

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

有没有办法为使用SIGTERM或SIGKILL杀死的进程保存概要分析信息?


阅读 311

收藏
2020-06-07

共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();
}
2020-06-07