我想用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)