C++ 如何通过远程日志库记录可能导致程序崩溃的分段错误和运行时错误?

C++ 如何通过远程日志库记录可能导致程序崩溃的分段错误和运行时错误?,c++,logging,C++,Logging,通过远程日志库记录程序崩溃的分段错误和运行时错误的技术是什么 语言是C++。 要捕获segfault信号并发送相应的日志,请阅读以下文章: 如果您无法从信号处理程序发送日志(可能是在记录器初始化之前发生的崩溃),那么您可能需要将信息写入文件,并让外部实体远程发送 编辑:放回一些原始信息,以便能够远程发送核心文件 为了能够远程发送核心文件,您需要一个外部实体(与崩溃的进程不同的进程),该实体将“等待”核心文件,并在它们出现时远程发送它们。(可能使用scp)此外,崩溃进程可以捕获segfault信

通过远程日志库记录程序崩溃的分段错误和运行时错误的技术是什么


<>语言是C++。 要捕获segfault信号并发送相应的日志,请阅读以下文章:

如果您无法从信号处理程序发送日志(可能是在记录器初始化之前发生的崩溃),那么您可能需要将信息写入文件,并让外部实体远程发送

编辑:放回一些原始信息,以便能够远程发送核心文件

为了能够远程发送核心文件,您需要一个外部实体(与崩溃的进程不同的进程),该实体将“等待”核心文件,并在它们出现时远程发送它们。(可能使用scp)此外,崩溃进程可以捕获segfault信号,并通知监控进程崩溃已经发生,并且核心文件将很快可用。

,例如,发生此类错误时您可以做什么


这就给您留下了将错误记录到远程库的问题。我建议保持信号处理程序尽可能简单,并记录到本地文件,因为当出现分段错误时,您不能假定先前初始化的日志库正常工作。我想给出一些解决方案:

  • 使用核心转储并启动守护程序来监视和收集核心转储并发送到主机
  • GDB(使用GdbServer),您可以远程调试,并在崩溃时查看回溯。
  • 通过远程日志库记录导致程序崩溃的分段错误和运行时错误的技术是什么

    ,在程序崩溃时尝试记录(远程或文件)调试消息可能不太可靠,尤其是当应用程序同时关闭系统时:

  • 使用TCP连接,系统崩溃时可能会丢失最后几条消息。(TCP维护数据包顺序并使用纠错,AFAIK。所以,如果应用程序刚刚退出,一些数据可能会在传输之前丢失)
  • 使用UDP连接时,由于UDP的性质,您可能会丢失消息并按顺序接收它们
  • 若您正在写入文件,操作系统可能会放弃最新的更改(缓冲区未刷新,日志文件系统恢复到文件的早期状态)
  • 每次通过TCP/UDP写入或发送消息后刷新缓冲区可能会导致每秒生成数千条消息的程序性能下降
  • 据我所知,好主意是在内存中维护明文日志文件,并在程序崩溃后编写一个内核转储。这样,您就可以在核心转储中找到日志文件的内容。此外,写入内存日志将比写入文件或通过网络发送消息快得多。或者,您可以使用某种“双重日志记录”——将每个调试消息立即写入内存日志,然后异步(在另一个线程中)发送到日志文件或通过网络发送

    例外情况的处理:

    平台特定。在Windows平台上,您可以使用并使用它来生成或将平台异常转换为C++异常。 在linux上,我认为您应该能够为SIGSEGV信号创建一个处理程序


    虽然捕获segfault听起来是个不错的主意,但与其试图从程序内部处理它,不如生成内核转储和保护。在windows上,您可以从程序内部使用,在linux系统上,可以配置为在shell中生成内核转储(
    ulimit-c
    ,我想?)。

    @MartinJames-这对segfaults没有多大帮助……这是一个依赖于平台的问题。那么,哪个平台?从配置文件页面上看,我猜是Linux。@VJovic为什么说它依赖于平台?无论如何,我想在Linux上使用它。也许我误解了这个问题,你只是想在发生SEGFULT时进行日志记录,还是远程发送实际的核心文件?外部程序不能是远程日志库的一部分,是吗?是的,我刚刚对你的问题添加了一条注释,我原本以为你想远程发送实际的核心文件。如果您只想在崩溃发生时进行日志记录,那么远程日志记录应该处于相同的过程中。但是要小心Rafal Rawicki在回答中提到的。@ Anisha,补充了一些原始文件,可以通过远程日志记录发送本地文件,可能是在下次启动时(如果你有一个看门狗,它会很快)。有没有C++程序让系统崩溃?@武良:是的,答案很明显。没有一个复杂的系统是完全没有错误的,因此有可能出现一个系统/驱动程序错误,这将使整个系统和程序崩溃。特别是如果你处理的是某种硬件(CUDA/DirectX/OpenGL),因为Linux内核没有C++实现的模块,我们可以假设C++是所有的用户域应用程序。如果用户域会导致内核崩溃,那就意味着用户/内核API的设计不好。我认为大多数(CUDA/DirectX/OpenGL)崩溃是GUI/X windows崩溃,而不是系统崩溃。事实上,内核调试中有很多技巧,比如RAM/NAND日志,但它们是常见的任务,而不是C++相关的。“我认为大多数”不太正确。那将是驾驶员级别的碰撞。在winOS上,它将关闭系统,导致BSOD、内存转储(如果已配置)和重新启动。linux上的情况取决于相应的驱动程序是X还是内核的一部分,以及内核在这种情况下的行为。“我们可能假设C++是所有用户域”无关。如果您有幸在内核/驱动程序中发现了新的bug,您将需要一种方法来找出到底发生了什么并绕过这个问题-bug不会立即得到修复,您的用户仍然需要您的ap