GNU libsigsegv

GNU libsigsegv是一个在用户模式下处理页面错误的库。页面错误当程序试图访问当前不可用。捕获和处理页面错误非常有用实施技术:

此库支持三组函数,均在<sigsegv.h>:

全局SIGSEGV处理程序:
sigsegv安装处理程序,sigsegv安装处理程序.
本地SIGSEGV处理程序(每个内存区域的处理程序):
sigsegv输入,sigsegv_寄存器,sigsegv_未注册,信号段调度.
堆栈溢出处理程序:
stackoverflow安装处理程序,堆栈流_安装_处理程序.

这三个API中的每一个都可以独立或同时使用。有关API的使用示例,请参阅:

关于可移植性

某些平台不支持此功能。<sigsegv.h>,的预处理宏HAVE_SIGSEGV_恢复如果全局和地方的SIGSEGV公司处理程序可用,预处理器宏HAVE_STACK_OVERFLOW_RECOVERY公司将定义堆栈溢出处理程序可用。注意,声明的函数在所有情况下都可用;在平台上HAVE_SIGSEGV_恢复HAVE_STACK_OVERFLOW_RECOVERY公司如果没有定义,它们只会返回错误代码或什么都不做。

已知此库工作的平台列表包含在文件PORTING。

关于可分页虚拟内存

可分页虚拟内存通常在操作系统内核中完成。这个库有助于实现其他库。

安装页面错误处理程序通常比每次访问都会检查软件,因为它实际上是检查页面是否存在的硬件(MMU)。

注意,如果您使用系统调用(如read())将数据写入write-受保护的页面,系统将返回-1并设置错误编号EFAULT公司,而不是发送信号SIGSEGV公司并重新启动系统呼叫。在这种情况下,程序必须执行SIGSEGV公司处理者会执行,然后重新启动read()操作。一些有缺陷的系统(SunOS 4)在这种情况下进入一个无休止的循环;在这些系统上,您必须在对某个区域调用read()之前,确保该区域是可写的,

关于堆栈溢出处理程序

在某些应用程序中,堆栈溢出处理程序执行一些清理或通知用户,然后立即终止应用程序。其他应用程序,堆栈溢出处理程序longjmps返回到中心应用程序中的点。此库支持这两种用途。在第二次在这种情况下,处理程序必须确保恢复正常的信号屏蔽(因为许多信号在执行处理程序时被阻止),并且还必须调用sigsegv_leave_handler()传递控制权;那么只有它才能longjmp离开。

请注意,longjmping返回到应用程序中的中心点可以离开应用程序处于不一致状态,因为

  1. 对正在解绕的调用帧不执行清理,
  2. 堆栈溢出时正在执行的代码可能会离开处于中间不一致状态的数据结构。
如果你想避免第一个问题,你需要重组你的应用程序分为三个或更多线程:您需要使用该功能pthread_sigmask除外的所有螺纹上处理程序线程,以确保SIGSEGV信号得到处理在指定的处理程序线程中。
如果你想避免第二个问题和第一个问题,您需要以如下方式封装操作数据结构的代码在对的呼叫中被中断是不安全的pthread_setcancelstatepthread_setcanceltype.
如果只想避免第二个问题,则需要操作所有数据以一种随时可以安全中断的方式使用gcc标志编译程序-fnon-call异常.

关于共享库

默认情况下,此库构建为静态库。这似乎很有用因为库的大小很小(4KB)。当然,您可以构建通过指定配置选项“--enable-shared”,将其作为共享库。

在包中使用libsigsegv

下载libsigsegv

libsigsegv可以从以下网址下载https://ftp.gnu.org/gnu/libsigsegv/libsigsegv-2.14.tar.gz.

邮件列表

libsigsegv公司具有以下邮件列表:

关于的公告libsigsegv公司大多数其他GNU软件都是在信息-菜单(档案文件).

参与进来

开发libsigsegv,一般来说,GNU是一项志愿工作,你可以做出贡献。对于信息,请阅读如何帮助GNU如果你愿意想参与进来,加入讨论邮件是个好主意列表(见上文)。

开发
对于开发源、问题跟踪器和其他信息,请参阅libsigsegv公司项目页面savannah.gnu.org.
维护人员
libsigsegov公司目前由维护布鲁诺·海布尔,埃里克·布莱克和保罗·邦齐尼(Paolo Bonzini)。请使用邮件列表联系。

许可

libsigsegov公司是自由软件;您可以重新发布和/或在的条款通用公共许可证由Free发布软件基础;许可证的版本2,或(在您的选项)任何更高版本。