3

海合会 (GCC) 4.5.3

GNU gdb (GDB) 7.5.50.20130309-cvs (cygwin-special)

网豆 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
4

3 回答 3

7

SIGSEGV 也不例外;这是一个信号。访问无效的内存地址称为分段错误。当您的程序执行此操作时,操作系统将向您的进程发送 SIGSEGV 信号。此信号的默认处理程序将立即终止该进程。

可以拦截一个信号,但这不是您应该自己处理的信号。如果你的程序导致了分段错误,那么它就有一个错误,这是毫无疑问的。

如果您已将分段错误与pretty << ptr->dump();线路隔离,我猜想问题可能ptr是没有指向有效对象。或者,该dump功能正在做坏事。

不要试图通过处理信号来解决这个问题。通过确保您的程序不会导致分段错误来解决此问题。

于 2013-03-15T23:42:01.123 回答
1

这里有两个问题。首先,您为什么要获得 SIGSEGV?这里可能没有足够的代码让我们知道,但是您对 ptr->dump() 的调用是否递归地调用了相同的函数?如果是这样,则您有无限递归,这会导致段错误。

第二个问题是你如何捕获信号,之前的响应者已经回答了这个问题。

于 2013-03-15T23:45:38.323 回答
0

throw您使用表达式引发异常。catch您在子句中捕获异常。

你通过调用 来发出信号raise。您可以通过在引发异常之前安装处理程序来处理信号。

任何其他动作和交互都是系统特定的(即不可移植)。

于 2013-03-16T00:22:52.000 回答