- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi, I was wondering if there is a good way to catch exceptions and generate a coredump from within TBB threads.. We need to be able to have corecump at the exact point of the exception when something critical occurs within a parallel algorithm.
Currently, I set an SEH translator with task_scheduler_observer:
class SEHHandler : public tbb::task_scheduler_observer
{
public:
SEHHandler() {
observe(true);
}
void on_scheduler_entry(bool is_worker) {
if (is_worker) {
_set_se_translator(MySEHTranslator);
}
}
} g_SEHHandler;
That said, if an exception (C++ or SEH) occurs in a TBB thread, it get caught and rethrown in the main calling thread without any context.
The only way I could find to make it work under windows/msvc was to put a try/except block in custom_scheduler.h in method:void custom_scheduler::local_wait_for_all()
__try {
...
} __except(MyExceptionHandler(GetExceptionInformation())) {
}
and
LONG
MyExceptionHandler(EXCEPTION_POINTERS*)
{
... call my routine to coredump process ...
return EXCEPTION_CONTINUE_SEARCH;
}
Any other ideas?
Mike
Link Copied
3 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi, I have some ideas to play with..
TBB has C++ exception handling support, please read the Reference: "Exceptions". And custom_scheduler already has catch blocks, please seeTbbCatchAll.
For SEH, you could use SEH translator to generate a dereviative from tbb::movable_exception and put your coredump code intomove() method. Though,I'm not sure whetherexact point of the exception can berestored this way (through C++ catch).
For C++ exception which cannot be derived from movable_exception, we have no other way to intercept it in original thread beside obvious ones:
1) put try-catch into body of your parallel algorithms
2)completely disable exception support by re-compiling TBB withTBB_USE_EXCEPTIONS=0.
In the latter case, an unhandled exception will cause the termination of the process which can be intercepted via a handler set by set_terminate().
Please say whether the suggested ideas are sufficient for you. And if not, please desribe your use-case in details so we could consider whether to support it, e.g. by extending observer with (for example) on_exception() callback..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi, thanks for your answers..
First option might not be ideal since it pollute every call site..
I tried second option and found that under the debugger, there is a default handler set that catches exceptions and display a messge box.. It won't enter function given to set_terminate. Outside the debugger, it works fine.
Not sure yet which one best fits our needs..
Regards.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Although, an on_exception() would be nice too ;)
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page