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

use*_*136 20 linux gprof

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

配置文件程序必须调用"exit"(2)或正常返回,以便将配置文件信息保存在gmon.out文件中.

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

use*_*136 27

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

  • 您还需要向编译器和链接器添加一些标志.对于g ++,你应该使用:-Wl, - no-as-needed -ldl -pg.资料来源:http://stackoverflow.com/questions/20369672/undefined-reference-to-dlsym (2认同)

wal*_*lyk 7

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

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