C++ 如何通过远程日志库记录可能导致程序崩溃的分段错误和运行时错误?
通过远程日志库记录程序崩溃的分段错误和运行时错误的技术是什么C++ 如何通过远程日志库记录可能导致程序崩溃的分段错误和运行时错误?,c++,logging,C++,Logging,通过远程日志库记录程序崩溃的分段错误和运行时错误的技术是什么 语言是C++。 要捕获segfault信号并发送相应的日志,请阅读以下文章: 如果您无法从信号处理程序发送日志(可能是在记录器初始化之前发生的崩溃),那么您可能需要将信息写入文件,并让外部实体远程发送 编辑:放回一些原始信息,以便能够远程发送核心文件 为了能够远程发送核心文件,您需要一个外部实体(与崩溃的进程不同的进程),该实体将“等待”核心文件,并在它们出现时远程发送它们。(可能使用scp)此外,崩溃进程可以捕获segfault信
<>语言是C++。 要捕获segfault信号并发送相应的日志,请阅读以下文章: 如果您无法从信号处理程序发送日志(可能是在记录器初始化之前发生的崩溃),那么您可能需要将信息写入文件,并让外部实体远程发送 编辑:放回一些原始信息,以便能够远程发送核心文件 为了能够远程发送核心文件,您需要一个外部实体(与崩溃的进程不同的进程),该实体将“等待”核心文件,并在它们出现时远程发送它们。(可能使用scp)此外,崩溃进程可以捕获segfault信号,并通知监控进程崩溃已经发生,并且核心文件将很快可用。,例如,发生此类错误时您可以做什么
这就给您留下了将错误记录到远程库的问题。我建议保持信号处理程序尽可能简单,并记录到本地文件,因为当出现分段错误时,您不能假定先前初始化的日志库正常工作。我想给出一些解决方案:
虽然捕获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