当前位置: 首页 > 面试题库 >

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

何涵育
2023-03-14
问题内容

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

被分析的程序必须调用“ exit”(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();
}


 类似资料:
  • 我有两个weblogic域,每个域都有一个托管服务器,问题是每3或4个小时可能会有不到四个进程突然被杀死,我在域控制台中发现了这一点。 ./startWebLogic。sh:第175行:53875杀死了${JAVA\u HOME}/bin/JAVA${JAVA\u VM}${MEM\u ARGS}-Dweblogic。名称=${SERVER\u Name}-Djava。安全策略=${WLU HOM

  • 我的进程在linux服务器上被杀,无需人工干预。我已经验证了以下场景。 用户或管理员均未进行手动干预以杀死 该进程占用16.5GB的虚拟内存,其中RAM为16GB,交换为50GB。 任务:总共393个,2个跑步,387个睡觉,4个停止,0个僵尸 Cpu:12.8%us,0.5%sy,0.0%ni,86.7%id,0.0%wa,0.0%hi,0.0%si,0.0%st 内存:总共16015M,使用8

  • 主要内容:执行步骤到目前为止,我们知道每当执行一个程序时,就会创建一个进程,并在执行完成后终止。 如果我们需要在程序中创建一个进程,并且可能希望为其安排不同的任务。 这可以实现吗? 是的,显然是通过进程创建来实现。 当然,工作完成后进程会自动终止,或者根据需要终止。 过程创建是通过系统调用实现的。 新创建的进程称为子进程,启动该进程的进程(或执行开始时的进程)称为父进程。 在系统调用之后,现在有两个进程 - 父进程

  • 我有一个单线程进程,它不会在终止条件下死亡。处理信号掩码未显示SIGTERM被阻塞。我以root身份执行“kill”。我可以使用SIGKILL终止进程,但这是更大系统的一部分,我希望SIGTERM能够工作。 注意Sig*属性。SigCgt、SigIgn和SigBlk表示SIGTERM既没有被捕获、忽略或阻塞(第15位未设置-将最低有效位计算为#1)。由于SIGTERM的默认配置是终止进程,我希望它

  • 在linux中,当主线程终止时,整个过程都会退出,不管它是以何种方式终止的,都是通过函数out()或从main返回。如果主线程从main()返回,它将返回到称为crt. o或类似的“C运行时”。在crt. o中,它的c代码是这样的:退出(main(argc, argv));退出()将由主线程 最终调用,结果,所有线程都终止。 我的想法正确吗? 如果在crt中。o exit()被诸如void thr

  • 我从UIImagePickerController获取UIIimage,并保存它,如下所示: 我可以立即访问它,没有问题,如下所示: 上面的代码返回保存的UImage完全没有问题。 事情是,当我杀了应用程序并重新启动它,它的图像没有找到!我目前正在使用Xcode6构建iOS7和8。我知道这个问题在模拟器中是不可避免的,但我也在一个现场设备上体验过。 (见Xcode 6每次运行后都会在iOS8模拟器