How to catch unhandled exceptions ?

Björn Döbel doebel at os.inf.tu-dresden.de
Sun Jun 2 12:03:58 CEST 2013


Hi,

> Is there any way to catch all system unhandled exceptions (seg fault,
> fpu fault, etc.) and "transform" them into C++ exceptions ?

I'm afraid you're confusing two kinds of exceptions here.

Hardware exceptions (e.g., page faults) are raised by the CPU during
execution and are delivered to a kernel-level handler function, because
that's what the hardware specification says. Fiasco.OC being a
microkernel, we do not handle those exceptions in a kernel, but reflect
them to user-level handler threads - the page fault handler and the
exception handler. Each thread on top of Fiasco.OC has a PF handler and
an exception handler thread assigned. Whenever a CPU exception occurs
while a thread executes, the respective handler threads get a notification.

This is also what the functions you found (thread control + exc_handler)
do - they can be used to assign PF and exception handlers to a thread.

In contrast, C++ language-level exceptions are raised synchronously by
your code (or some library) using the C++ 'throw' keyword. These
language-level exceptions can be caught and handled using try/catch-blocks.

Transforming hardware exceptions into C++ exceptions appears to be
difficult: Suppose, your thread raises a page fault and you want to make
this a C++ exception - what happens if your exception handler raises
another page fault - leading to another exception that raises yet
another page fault ...

Also, C++ exceptions need to be caught in the thread that raised the
exception, otherwise the exceptions causes a call to std::terminate,
wich will abort your application. Hence, you'd need try/catch statements
for all potential hardware exceptions around all your threads' code.

I'm not saying it can't be done (I vaguely remember Choices OS [1] doing
this), it's just not what we are doing on Fiasco right now.

[1] http://choices.cs.uiuc.edu/

 Bjoern




More information about the l4-hackers mailing list