我有一个异步记录器,它通过工作线程将日志写入文件。它保留一个消息队列,并按顺序将它们写入磁盘。
如果我的程序触发了分段错误,那么我不能保证打印所有消息。
我正在考虑使用std::signal
捕获SIGSEGV
,刷新异步记录器,然后退出程序。
这合理吗?或者在分段故障发生后,行为是否完全未定义。
接收SIGSEGV后的行为肯定不是未定义的。通常,一些JVM会从被取消引用的实际空指针中生成NullPointerException。
请参阅http://man7.org/linux/man-pages/man7/signal-safety.7.html对于信号处理程序中官方允许的内容。
在频繁出现NULL或未初始化指针访问的情况下,实际问题很可能被定位在触发SEGV的线程中,刷新记录器也很好。当然,正如@paulmckenzie已经解释的那样,这是在刷新记录器获得的额外信息和完全没有信息的风险之间的权衡。