gcc(GCC)4.5.3
GNU gdb(GDB)7.5.50.20130309-cvs(cygwin-special)
Netbeans 7.3
我在代码中捕获SIGSEGV,Segment Fault Exception时遇到了一些麻烦。 try-catch没有捕获它(下面的代码)。这是一个不可捕获的例外吗?有没有办法抓住它? (当然)我做错了什么?
本领域
string SlipStringOp::dump(const SlipCell& X) const {
stringstream pretty;
PTR ptr = *getPtr(X);
pretty << "[string ] " << dumpLink(X) << " = "
<< setfill('0') << setw(8) << hex << ptr
<< " -> ";
try {
pretty << ptr->dump();
} catch(exception& e) {
pretty << e.what();
postError(SlipErr::E3023, "SlipStringOp::dump", "", "Deletion of cell deleted the pointer.");
} catch(...) {
postError(SlipErr::E3023, "SlipStringOp::dump", "", "Deletion of cell deleted the pointer.");
}
return pretty.str();
}; // string SlipStringOp::dump(const SlipCell& X) const
答案 0 :(得分:7)
SIGSEGV也不例外;这是一个信号。访问无效的内存地址称为分段错误。当您的程序执行此操作时,操作系统将向您的进程发送SIGSEGV信号。此信号的默认处理程序将立即终止该过程。
你can intercept a signal,但这不是你应该自己处理的信号。如果您的程序导致分段错误,那么它就有一个错误,毫无疑问。
如果您已将分段错误隔离到pretty << ptr->dump();
行,我猜测问题可能是ptr
未指向有效对象。或者,dump
功能正在做坏事。
不要尝试通过处理信号来解决此问题。 通过确保您的程序不会导致分段错误来解决此问题。
答案 1 :(得分:1)
这里有两个问题。首先,你为什么要获得SIGSEGV?这里可能没有足够的代码告诉我们,但是你是否要求ptr-&gt; dump()以递归方式调用相同的函数?如果是这样,你有无限递归,这就是导致seg错误。
第二个问题是你如何捕获信号,并且之前的响应者已经回答了这个问题。
答案 2 :(得分:0)
使用throw
表达式抛出异常。您在catch
子句中捕获异常。
通过拨打raise
发出信号。您可以在引发异常之前通过安装处理程序来处理信号。
任何其他操作和交互都是系统特定的(即不可移植)。