C++ 用C+记录进程终止的原因+;在Linux上

C++ 用C+记录进程终止的原因+;在Linux上,c++,linux,logging,handle,terminate,C++,Linux,Logging,Handle,Terminate,是否有任何方法可以记录、处理或以其他方式留下有关进程终止原因的线索,包括尽可能多的导致终止的事件 我的应用程序有一个日志记录工具,每分钟记录许多消息。我在超级try-catch块中运行几乎整个程序,这样我就可以记录任何未处理的异常。我最近还尝试为可能终止进程的各种进程信号注册处理程序。然而,应用程序仍然每天崩溃几次,我不知道为什么 我可能无法记录或处理多少其他致命事件?我希望有一个合适的方法来做到这一点,而不是在过程因某种我还没有意识到的新类型事件而死亡时一直被蒙在鼓里 非常感谢。拥有超级try

是否有任何方法可以记录、处理或以其他方式留下有关进程终止原因的线索,包括尽可能多的导致终止的事件

我的应用程序有一个日志记录工具,每分钟记录许多消息。我在超级try-catch块中运行几乎整个程序,这样我就可以记录任何未处理的异常。我最近还尝试为可能终止进程的各种进程信号注册处理程序。然而,应用程序仍然每天崩溃几次,我不知道为什么

我可能无法记录或处理多少其他致命事件?我希望有一个合适的方法来做到这一点,而不是在过程因某种我还没有意识到的新类型事件而死亡时一直被蒙在鼓里


非常感谢。

拥有超级
try/catch
块意味着可捕获的异常不会未经处理。请注意,所有已启动的线程都需要这些块

除此之外,您可以使用捕获终止信号。这些是:

  • SIGABRT(信号中止)异常终止,如由中止功能启动
  • SIGFPE(信号浮点异常)错误的算术运算,如零除或导致溢出的运算(不一定是浮点运算)
  • SIGILL(信号非法指令)无效的函数映像,例如非法指令。这通常是由于代码损坏或试图执行数据造成的
  • SIGINT(信号中断)交互式注意信号。通常由应用程序用户生成
  • SIGSEGV(信号分段冲突)对存储器的访问无效:当程序试图读取或写入内存之外的内容时,它被分配给它。 SIGTERM(信号终止)终止请求发送到程序
  • 信号由实现定义,但大多数崩溃原因应包含在这些定义中

同样,可能是程序没有崩溃,而是通过从main返回(但我想您已经讨论过了)或通过调用
退出
来终止。在这种情况下,您可以检查程序的返回值并记录该值。

有一个super
try/catch
块意味着无法处理可捕获的异常。请注意,所有已启动的线程都需要这些块

除此之外,您可以使用捕获终止信号。这些是:

  • SIGABRT(信号中止)异常终止,如由中止功能启动
  • SIGFPE(信号浮点异常)错误的算术运算,如零除或导致溢出的运算(不一定是浮点运算)
  • SIGILL(信号非法指令)无效的函数映像,例如非法指令。这通常是由于代码损坏或试图执行数据造成的
  • SIGINT(信号中断)交互式注意信号。通常由应用程序用户生成
  • SIGSEGV(信号分段冲突)对存储器的访问无效:当程序试图读取或写入内存之外的内容时,它被分配给它。 SIGTERM(信号终止)终止请求发送到程序
  • 信号由实现定义,但大多数崩溃原因应包含在这些定义中

同样,可能是程序没有崩溃,而是通过从main返回(但我想您已经讨论过了)或通过调用
退出
来终止。在这种情况下,您可以检查程序的返回值并记录该值。

您可以注册一个函数来处理意外异常:

如果没有,delt将导致应用程序调用Terminate()


您可以注册一个函数来记录终止时的情况:

您可以添加自己的日志函数来完成一些事情(设置一个标志,这样它只在异常退出时才执行这些事情,然后在离开main之前设置该标志)


信号处理程序可能很棘手(特别是如果您希望它们是可移植的)。如果您使用它们,您在内部安全操作方面受到限制,因此我通常限制自己设置全局标志,以便它们可以由普通代码处理(当然,如果您正在终止,则这是非常有限的)。

您可以注册一个函数来处理意外异常:

如果没有,delt将导致应用程序调用Terminate()


您可以注册一个函数来记录终止时的情况:

您可以添加自己的日志函数来完成一些事情(设置一个标志,这样它只在异常退出时才执行这些事情,然后在离开main之前设置该标志)


信号处理程序可能很棘手(特别是如果您希望它们是可移植的)。如果您使用它们,您在内部安全操作方面受到限制,因此我通常限制自己设置一个全局标志,以便它们可以由普通代码处理(当然,如果您终止,那么这是非常有限的)。

一个代码抵得上许多字:

#include <iostream>
#include <signal.h>

sigint_handler(int s) {
    std::cout<<"signal caught: "<<s<<std::endl;
    ::exit(-1);
}

void setup_signal() {
    struct sigaction sigIntHandler;
    sigIntHandler.sa_handler = sigint_handler;
    sigemptyset(&sigIntHandler.sa_mask);
    sigIntHandler.sa_flags = 0;
    sigaction(SIGINT, &sigIntHandler, NULL);
    sigaction(SIGTERM, &sigIntHandler, NULL);
}

int main() {
    setup_signal();
    /* do stuff */
    return 0;
}
#包括
#包括
信号处理器(int s){

std::cout一个代码胜过许多单词:

#include <iostream>
#include <signal.h>

sigint_handler(int s) {
    std::cout<<"signal caught: "<<s<<std::endl;
    ::exit(-1);
}

void setup_signal() {
    struct sigaction sigIntHandler;
    sigIntHandler.sa_handler = sigint_handler;
    sigemptyset(&sigIntHandler.sa_mask);
    sigIntHandler.sa_flags = 0;
    sigaction(SIGINT, &sigIntHandler, NULL);
    sigaction(SIGTERM, &sigIntHandler, NULL);
}

int main() {
    setup_signal();
    /* do stuff */
    return 0;
}
#包括
#包括
信号处理器(int s){
std::cout检查这个问题。

在这里,您将看到使用bash获取进程的退出代码比使用信号处理程序或任何类型的退出回调要容易得多。

检查这个问题。


在这里,您将看到,使用bash获取进程的退出代码比使用信号处理程序或任何类型的退出回调要容易得多。

以下是我在程序中使用的,它对我有效……每当我的程序崩溃时,它都会将崩溃站点的堆栈跟踪打印到stdout(这可能会被重定向到一个文件或其他文件,您可以稍后在其中读取它)

请注意,您可能需要将-rdynamic作为