分段错误处理程序是否应该由应用程序程序员用C编写?

分段错误处理程序是否应该由应用程序程序员用C编写?,c,segmentation-fault,async-safe,C,Segmentation Fault,Async Safe,如果某人是操作系统程序员或编写系统级库代码,那么编写分段故障处理程序是有意义的。例如,操作系统程序员编写代码,向该应用程序进程发送信号SIGSEGV。或者,系统库程序员可能会处理该信号SIGSEGV,并可能会撤销由库代码导致的用于创建分段错误的操作。但是为什么C语言中的应用程序程序员需要编写分段错误处理程序呢?如果他编写了一个处理程序,那么他已经损坏了内存的某些部分。您能给出一个实例,让应用程序程序员处理分段错误并继续执行程序吗?AFAIK,分段处理程序可以在应用程序级别编写,以输出一些调试信息

如果某人是操作系统程序员或编写系统级库代码,那么编写分段故障处理程序是有意义的。例如,操作系统程序员编写代码,向该应用程序进程发送信号SIGSEGV。或者,系统库程序员可能会处理该信号SIGSEGV,并可能会撤销由库代码导致的用于创建分段错误的操作。但是为什么C语言中的应用程序程序员需要编写分段错误处理程序呢?如果他编写了一个处理程序,那么他已经损坏了内存的某些部分。您能给出一个实例,让应用程序程序员处理分段错误并继续执行程序吗?

AFAIK,分段处理程序可以在应用程序级别编写,以输出一些调试信息(如内存转储、寄存器值和其他应用程序特定的信息)然后退出应用程序

请注意,由于分段错误可能已损坏内存,因此可能会或可能不会获得要转储的所有正确信息

我不知道在任何情况下,分割错误后程序的执行可以继续。可能其他受尊敬的用户也会对这一点有所了解

library programmer might handle that signal SIGSEGV and may 
undo the operations caused by the library code for creating segmentation
发生分段错误意味着线程或进程将死亡


无法撤消分段错误导致的代码。相反,您可以重新启动该组件

分段错误是由程序写入不应该写入的内存部分引起的。应用程序开发人员不会编写代码来处理这个问题,他们编写代码是为了避免它。这就是为什么在写入内存时绑定检查。

您可以捕获除SIGKILL、SIGCONT和SIGSTOP之外的任何信号。因此,您可以捕获SIGSEGV,但如果您决定不退出,行为将不可预测。

处理SIGSEGV等可能允许保存状态并采取纠正措施。(和其他)是正确的,您不能简单地重新启动主线代码。相反,您可以
longjmp()
siglongjmp()
;这允许主线重新启动。此外,您必须非常小心地仅调用
异步安全
函数。这很棘手。然而,有些应用程序

  • 健康/安全-确保灾难性情况不会发生
  • 财务-交易数据丢失,可能导致金钱损失
  • 控制系统-化学家滴定软件示例
  • 诊断-可能会记录崩溃情况,以改进未来的软件。依照
  • 调用
    exit()。区别在于
    atexit()
    调用

    另请参见:,
    这些操作系统因操作系统而异。任何建议都将取决于系统


    其他问题

    • 程序使用的某些库可能捕获
      SIGSEGV
      。肯定是Empress数据库钩子版吧。您必须知道您的库正在使用什么,并与它们链接
    • 堆栈和堆(malloc等)可能会损坏,包括
      jump\u buf
      ,因此您的错误处理可能特别偏执
    • 还有许多其他替代解决方案,例如将关键部分推迟到另一个更简单的任务
    • 根据C99标准,从信号调用的
      longjmp()
      未定义,但它在大多数系统上都能正常工作。如果你比较迂腐,可以使用。它可以用于诊断日志记录,但我不会用于列出的其他用途(安全等)。通知看门狗任务可能更合适

    为什么要在SEGFULT之后继续进行检查,以导致更多SEGFULT?编写处理程序是为了避免SEGFAULTS,检查边界条件,如果代码中有可能导致SEGFAULTS,比如malloc后返回NULL,那么应该检查并退出或中断,但不应该继续避免SEGFAULTS。