5

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

语言是 C++。

4

4 回答 4

6

这是打印回溯的解决方案,当您遇到 segfault时,例如当发生此类错误时您可以做什么。

这会给您留下将错误记录到远程库的问题。我建议保持信号处理程序尽可能简单并记录到本地文件,因为你不能假设以前初始化的记录库在发生分段错误时正常工作。

于 2012-05-08T10:07:32.950 回答
1

我想给出一些解决方案:

  1. 使用核心转储并启动守护程序来监视和收集核心转储并发送到您的主机。
  2. GDB(使用 GdbServer),您可以远程调试并在崩溃时查看回溯。 在此处输入图像描述
于 2012-05-08T11:07:48.090 回答
1

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

根据我的经验,在程序崩溃时尝试记录(远程或文件)调试消息可能不是很可靠,特别是如果 APP 将系统随之关闭:

  1. 使用 TCP 连接,您可能会在系统崩溃时丢失最后几条消息。(TCP维护数据包顺序并使用纠错,AFAIK。所以如果应用程序刚刚退出,一些数据可能会在传输之前丢失)
  2. 使用 UDP 连接,由于 UDP 的性质,您可能会丢失消息并无序接收它们
  3. 如果您正在写入文件,操作系统可能会丢弃最近的更改(缓冲区未刷新,日志文件系统恢复到文件的早期状态)。
  4. 每次通过 TCP/UDP 写入或发送消息后刷新缓冲区可能会导致每秒产生数千条消息的程序的性能损失。

据我所知,一个好主意是维护内存中的纯文本日志文件,并在程序崩溃后编写核心转储。这样您就可以在核心转储中找到日志文件的内容。写入内存日志也比写入文件或通过网络发送消息要快得多。或者,您可以使用某种“双重日志记录” - 立即将每条调试消息写入内存日志,然后将它们异步(在另一个线程中)发送到日志文件或通过网络。

异常处理:

特定于平台。在 Windows 平台上,您可以使用_set_se_handlers并使用它来生成回溯或将平台异常转换为 c++ 异常。

在 linux 上,我认为您应该能够为 SIGSEGV 信号创建处理程序。

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

于 2012-05-08T12:01:24.020 回答
0

要捕获 segfault 信号并相应地发送日志,请阅读这篇文章:

捕获“段错误”有什么意义吗?

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

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

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

于 2012-05-08T10:05:48.813 回答