通过远程日志库记录导致程序崩溃的分段错误和运行时错误的技术是什么?
语言是 C++。
这是打印回溯的解决方案,当您遇到 segfault时,例如当发生此类错误时您可以做什么。
这会给您留下将错误记录到远程库的问题。我建议保持信号处理程序尽可能简单并记录到本地文件,因为你不能假设以前初始化的记录库在发生分段错误时正常工作。
我想给出一些解决方案:
通过远程日志库记录导致程序崩溃的分段错误和运行时错误的技术是什么?
根据我的经验,在程序崩溃时尝试记录(远程或文件)调试消息可能不是很可靠,特别是如果 APP 将系统随之关闭:
据我所知,一个好主意是维护内存中的纯文本日志文件,并在程序崩溃后编写核心转储。这样您就可以在核心转储中找到日志文件的内容。写入内存日志也比写入文件或通过网络发送消息要快得多。或者,您可以使用某种“双重日志记录” - 立即将每条调试消息写入内存日志,然后将它们异步(在另一个线程中)发送到日志文件或通过网络。
异常处理:
特定于平台。在 Windows 平台上,您可以使用_set_se_handlers并使用它来生成回溯或将平台异常转换为 c++ 异常。
在 linux 上,我认为您应该能够为 SIGSEGV 信号创建处理程序。
虽然捕获 segfault 听起来是一个不错的主意,但与其尝试从程序中处理它,不如生成核心转储和保释。在 Windows 上,您可以在程序中使用MiniDumpWriteDump,在 linux 系统上可以配置为在 shell 中生成核心转储(ulimit -c
我认为?)。
要捕获 segfault 信号并相应地发送日志,请阅读这篇文章:
如果事实证明您无法从信号处理程序发送日志(可能在初始化记录器之前发生崩溃),那么您可能需要将信息写入文件并让外部实体远程发送。
编辑:放回一些原始信息以便能够远程发送核心文件
为了能够远程发送核心文件,您需要一个外部实体(与崩溃的进程不同的进程),它将“等待”核心文件并在它们出现时远程发送它们。(可能使用 scp)此外,崩溃进程可以捕获 segfault 信号并通知监控进程发生了崩溃,并且核心文件将很快可用。