Segmentation fault 治疗

我有一个我用来捕获的应用程序 segmentation fault 或者 ctrl-c.
使用下面的代码,我可以抓住 segmentation fault, 但是一次又一次地调用处理程序。 我怎么能阻止他们?
在你的注意事项上,我不想超出我的申请。 我只能注意到所有损坏的缓冲区。

是否有可能?


void SignalInit/void /
{

struct sigaction sigIntHandler;

sigIntHandler.sa_handler = mysighandler;
sigemptyset/&sigIntHandler.sa_mask/;
sigIntHandler.sa_flags = 0;
sigaction/SIGINT, &sigIntHandler, NULL/;
sigaction/SIGSEGV, &sigIntHandler, NULL/;

}


处理程序看起来像这样。


void mysighandler//
{
MyfreeBuffers//; /*related to my applciation*/
}


这里用于信号 Segmentation fault 处理程序称为几次,并且显然, MyfreeBuffers// 让我错误地发布已经发布的内存。 我只想释放自己一次,但仍然不想离开这个应用程序。

请帮忙。
已邀请:

小明明

赞同来自:

默认操作的情况
SIGSEGV

, 它是完成您的进程,但由于您已安装了一个处理程序,因此它将导致您的处理程序覆盖默认行为。 但问题是球队 segfaulting 完成处理程序后可以重复,如果您没有采取行动纠正第一个错误 seg, 重新命令再次出错,它将继续并继续。

因此,首先找到导致的指令
SIGSEGV

, 并试图解决它 /你可以称之为
backtrace//

在处理程序中,看看出了什么问题/

另外,标准 POSIX 说

在通常在通常返回之后无法确定该过程的行为
信号捕获功能 [XSI] SIGBUS, SIGFPE, SIGILL 或者
SIGSEGV, 哪个未生成 kill//, [RTS] sigqueue//,
或者 raise//.

所以,你需要做的完美事物 - 它是首先修复你的segfolte。

在线处理程序输出处理 / 脱机不旨在绕过阻止基本错误

所以最好的报价是 -

不要抓住
SIGSEGV


. 让他重置核心。 分析主要。 纠正错误的内存链接,就是这样!

小姐请别说爱

赞同来自:

我绝对不同意声明

"Don't catch the SIGSEGV"

.

这是一个非常好的做法

意外

情况。 这是应对的更清洁

指针 NULL /定义 malloc/ 用信令机制 , 相关的S.
setjmp/longjmp

, 如何在整个代码中分发错误管理。

但请注意 , 如果你使用怎么办 ''sigaction'' 在
SEGV

, 你不必忘记说话
SA_NODEFER


sa_flags

- 或者找到另一种方法来应对这个事实
SEGV

只拨打一次处理器一次。


#include <setjmp.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>

static void do_segv//
{
int *segv;

segv = 0; /* malloc/a_huge_amount/; */

*segv = 1;
}

sigjmp_buf point;

static void handler/int sig, siginfo_t *dont_care, void *dont_care_either/
{
longjmp/point, 1/;
}

int main//
{
struct sigaction sa;

memset/&amp;sa, 0, sizeof/sigaction//;
sigemptyset/&amp;sa.sa_mask/;

sa.sa_flags = SA_NODEFER;
sa.sa_sigaction = handler;

sigaction/SIGSEGV, &amp;sa, NULL/; /* ignore whether it works or not */

if /setjmp/point/ == 0/
do_segv//;

else
fprintf/stderr, "rather unexpected error\n"/;

return 0;
}


</string.h></stdio.h></signal.h></setjmp.h>

冰洋

赞同来自:

如果一个
SIGSEGV

它再次工作,明显的结论是挑战
MyfreeBuffers//;


不是

消除了主要问题 /如果这个功能真的只做了
free//

一些孤立的记忆,我不确定你为什么这么认为/.

粗略地讲, a
SIGSEGV

尝试访问无法访问的内存地址时触发。 如果您不会留下应用程序,则需要进行此内存地址可用,或更改执行路径
longjmp//

.

龙天

赞同来自:

你不应该尝试继续
SIG_SEGV

. 这基本上意味着您的应用环境是不知何故损坏的。 也许你只是上升了指针 null, 或者可能某种错误导致您的程序损坏了堆栈,一堆或一些可变指针,您只是不知道。 你唯一能做的事情

安全, - 这已完成。

完全合法地处理控制。 许多应用程序都这样做了,但您应该非常小心,您在信号处理程序中究竟在做什么。 您无法调用任何未再投资的功能。 因此,这意味着如果你的
MyFreeBuffers//

导致功能 stdlib
free//

, 你可能需要。 如果用户点击 control-C, 当程序在中间
malloc//

或者
free//

因此,中途操纵他们用来跟踪堆的分布的数据结构,如果你打电话,你几乎肯定会破坏一堆群
malloc//

或者
free//

在信号处理程序中。

您在信号处理程序中可以做的唯一安全的东西 - 这是为了设置旗帜,可以说你抓住了信号。 然后,您的应用程序可以定期询问标志以决定它是否需要执行一些操作。

江南孤鹜

赞同来自:

嗯,如果未安装它,您可以设置状态变量和仅释放内存。 每次无法控制它时都会调用信号处理程序。 AFAIK.

君笑尘

赞同来自:

我在恢复的情况下看到 SIG_SEGV, 如果您在周期中处理事件以及其中一个事件导致违反分段的事件,那么您只想通过继续处理其他事件来跳过此事件。 在我眼里 SIG_SEGV 看起来像 NullPointerException 在 Java. 是的,在任何一个之后,国家将不一致,但在某些情况下,您想应对这种情况并继续。 例如,在 Algo trading 您将暂停执行订单并允许交易者手动进行管理,而不会破坏整个系统,而不会销毁所有其他订单。

二哥

赞同来自:

似乎至少在 Linux 使用诀窍与选项 -fnon-call-exceptions 可能是一个解决方案。 这将使信号可以将信号转换为常规异常。 C++ 并一般处理它。
看着
https://coderoad.ru/9225415/
例如。

要回复问题请先登录注册