我想用gprof的剖析一个守护进程。 我的守护程序使用第三方库,用它注册了一些回调,然后调用一个main
功能,即永远不会返回。 我需要调用kill
(无论是SIGTERM或SIGKILL)终止该守护程序。 不幸的是,gprof的手册页说以下内容:
异形程序必须调用“退出”(2)或常才能将其保存在文件是gmon.out的分析信息返回。
是否有办法救分析信息:这是死于SIGTERM或SIGKILL流程?
我想用gprof的剖析一个守护进程。 我的守护程序使用第三方库,用它注册了一些回调,然后调用一个main
功能,即永远不会返回。 我需要调用kill
(无论是SIGTERM或SIGKILL)终止该守护程序。 不幸的是,gprof的手册页说以下内容:
异形程序必须调用“退出”(2)或常才能将其保存在文件是gmon.out的分析信息返回。
是否有办法救分析信息:这是死于SIGTERM或SIGKILL流程?
首先,我要感谢@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()
。