2010-11-13 78 views
0

我使用ncurses的,每当我得到一个segfault,ncurses的不正确释放终端的控制(因为endwin()从未被调用)。我设置了一个信号处理程序:最后块分割故障(C++)

void handler(int signum) { 
    endwin(); 
    exit(EXIT_FAILURE); 
} 

但这个问题是内存设计缺陷被忽略,因为endwin后反对推迟到()。我对C++相当陌生; segfaults可以被捕获为异常,这样我可以有一个finally块?还是有一些重新从处理程序内部重新发布segfault?

+0

可能的重复[如何在Linux中捕获段错误?](http://stackoverflow.com/questions/2350489/how-to-catch-segmentation-fault-in-linux) – casablanca 2010-11-13 01:02:00

+0

只是出于兴趣,什么如果在信号处理程序中放置断点,会发生什么? gdb可以回到原始段落的上下文吗? – 2010-11-13 01:30:20

+0

C++没有finally块。使用一个哨兵类,它的析构函数调用endwin(); – 2010-11-13 05:57:25

回答

4

段错误是不确定的行为。你必须找到并修复它。不要担心没有释放终端的ncurses,并找到并修复该错误。

+0

我想我应该更清楚。这仅仅是用于调试我的代码的实际问题。当我遇到段错误时,我想去找到它并修复它,但是当ncurses仍然没有释放终端时,很难操作GDB。我最终发现了这个错误,但是花了我的时间超过了它,并且在我继续编码时,我可能会有更多的错误。所以没有办法去做我在问什么? – Nick 2010-11-13 01:25:50

+0

@Nick:当你点击一个段错误就意味着你已经拧东西涨得很厉害,有在继续,因为什么,你要做的仅仅是使事情变得更糟没有任何意义。 – 2010-11-13 01:34:07

+0

@Martin York:并不是他不想修复这个bug,而是在所有的资源都没有被放弃的时候发现bug更难。想象一下,如果您每次都必须重新启动计算机以修复空指针解除引用,那么您是否不想找到避免重新引导的方法? – dreamlax 2010-11-13 01:39:25

0

signal手册页:

根据POSIX,一个过程的行为是未定义它忽略不是由杀灭产生的SIGFPE,SIGILL, 或SIGSEGV信号(2)之后或提高(3)。

试图做任何事情后,赛格故障是疯了。这就像碰撞后激活的安全气囊,你继续驾驶,因为,你有一个安全气囊,它会让你在碰撞中安全。用处理程序来处理这个事情并不是方法。

一种方法是使你的程序从文件中输入或存根出的输出。您也可以尝试remotely attaching to a process with gdb。从来没有做过,但它可能是值得一试。

+0

不,这就像碰撞你的车,想着,“嘿,我应该抓住我的孩子才离开燃烧的车辆。” (在这种情况下,孩子是终端。) 远程调试可能会奏效,但它看起来复杂。我可以尝试它,但我宁愿将它作为极端的最后手段。 – Nick 2010-11-13 01:54:08