Boost logo

Boost :

From: David Abrahams (abrahams_at_[hidden])
Date: 2000-05-28 05:54:52

The problem: This applies to programs generated by all compilers using
Microsoft-compatible EH when run outside a debugger. I plan to write a longer
exposition, but I thought I should post this quickly.


#include <iostream>

struct X { ~X() { std::cout << "~X" << std::endl; } };

void crash()
    *((char*)0) = 0;

void crash_indirectly()
    X x;

int main()
   try {
       crash_indirectly(); // You never find out about this crash
   catch(...) { }
   try {
       crash_indirectly(); // When post-mortem debugging starts,
   } // X::~X has already run (twice).
   catch(...) {


The solution:

#include <windows.h>
void structured_exception_translator(
     unsigned int exception_code, EXCEPTION_POINTERS* pExp)
    throw; // magic!

static void (*saved_translator)(unsigned, EXCEPTION_POINTERS*)
  = _set_se_translator(structured_exception_translator);


The line labelled "magic!" above is still a bit of a mystery to me. Without it,
the debugger appears to re-start the program in the
structured_exception_translator, but the program immediately continues just as
in the first example (except that the debugger has been invoked). If anyone has
insight into this, I'd appreciate it. I'm sure it's a nitty-gritty Windows
thing, the sort of thing I try to avoid and had to muck about in too much
already to get this far ;). I plan to write a short article for the C++ Report
about this once I get that final detail worked out.


Boost list run by bdawes at, gregod at, cpdaniel at, john at