Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I get a segmentation fault instead of an exception

In the following code, at the first iteration I get an exception, and at the second one I get a segmentation fault with no error message printed. It seems the exception is not caught:

int i = 0;
while(i++ < 10)
{
   try {
      cout << "Iteration: " << i << endl;
      // Code...
      cout << "OK" << endl;
   }
   catch(...)
   {
      cerr << "Error message" << endl;
      continue;
   }
}

Output:
Iteration 1
Error message
Iteration 2
Segmentation fault

Is it normal, or there is something really wrong going on?

In case it should be relevant, in that code block I reset a MySQL connection, and the exception is generated when I check if the connection is closed.

Thank's.


Platform:
Linux - OpenSuse 11.4
C++ - GCC 4.5.1
Intel Xeon

like image 296
Pietro Avatar asked Feb 15 '13 17:02

Pietro


People also ask

Why do I keep getting segmentation fault?

In practice, segfaults are almost always due to trying to read or write a non-existent array element, not properly defining a pointer before using it, or (in C programs) accidentally using a variable's value as an address (see the scanf example below).

How do you fix a segmentation fault?

It can be resolved by having a base condition to return from the recursive function. A pointer must point to valid memory before accessing it.

Is segmentation fault a memory leak?

No, a segmentation fault in itself is not that much more than trying to access a piece of memory that you are not allowed access to. A memory leak on the other hand is when you allocate some memory and later on 'forget' the location of the piece of memory.

Is segmentation fault a signal?

1) Segmentation Fault (also known as SIGSEGV and is usually signal 11) occur when the program tries to write/read outside the memory allocated for it or when writing memory which can only be read.In other words when the program tries to access the memory to which it doesn't have access to.


1 Answers

Since segfaults are not caused (directly) the the software, but rather by the processor detecting that you are trying to access invalid memory (or access memory in an invalid way - e.g writing to memory that is write-protected, executing memory that isn't supposed to be executed, etc), it is not "catchable" with try/catch, which is designed to catch software that throws an exception. They are both called exceptions, but they originate at different levels of the software/hardware of the system.

Technically, you can catch segfaults with a signal handler for SIGSEGV. However, as Ivaylo explains, it's is not, typically, allowed to just "try again" if you get a segfault. The signal hander for SIGSEGV is allowed to longjmp or exit, but shouldn't just return.

Read more about signals here: http://www.alexonlinux.com/signal-handling-in-linux

Typical C++ exceptions (result of throw) can be retried without problem (of course, the same exception may be thrown again, of course.

like image 107
Mats Petersson Avatar answered Oct 04 '22 17:10

Mats Petersson