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

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

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

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

Solutions Collecting From Web of "在杀死一个进程之前保存gmon.out"

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

您可以添加一个信号处理程序的第三方库不捕获或忽略的信号。 可能SIGUSR1已经足够好了,但是要么试验或者读取图书馆的文档 – 如果它足够的深入。

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