Dwarf-2 EH. Реализация для Windows сама по себе не разработана для работы в условиях исполнения 64-битны приложений Windows. В режиме win32 вызываемый обработчик исключения не может распространяться на код, не совместимый со стандартом dw2; это означает, что любое исключение, которое происходит через любые "чужие фреймы" non-dw2 приведет к отказу, включая системные DLL Windows и DLL, встроенные в Visual Studio. Раскручивание кода Dwarf-2 в gcc включает инспектирование сборки x86, и оно не может происходить без соответствующей отладочной информации dwarf-2.
SjLj, SetJump LongJump. Этот метод обработки исключений работает в большинстве случаев на обоих платформах win32 и win64, за исключением сбоев общей защиты (general protection faults). Поддержка структурированной обработки ошибок разработана для gcc с целью преодолеть недостатки dw2 и sjlj. На платформе win64, информация отката размещается в секции xdata и в .pdata (таблица описания функции) вместо стека. Для win32 цепочка обработчиков сохраняется в стеке, и нуждается в сохранении/восстановлении с помощью реально выполняющегося кода.
GCC поддерживает два метода обработки исключений (EH):
DWARF-2 (DW2) EH, который требует наличия в выполняемом коде отладочной информации DWARF-2 (или DWARF-3). DW-2 EH может привести к некоторому разрастанию размера исполняемого кода, потому что в код добавляется большие таблицы отката по содержимому стека.
SJLJ. Этот метод базируется на setjmp/longjmp (SJLJ). Он несколько медленнее, чем DW2 EH (влияет даже на нормальное выполнение, когда не срабатывают исключения), однако он может работать поверх кода, который не был скомпилирован GCC, или в котором нет информации о истории вызовов через стек (call-stack unwinding information).
Structured Exception Handling (SEH). Windows использует свой собственный механизм обработки исключений, известный как Structured Exception Handling (SEH). К сожалению, GCC пока его не поддерживает. Однако обещается, что для x64 в появится поддержка SEH начиная с версии GCC 4.8.
См. также:
Exception handling models of GCC site:stackoverflow.com
C++ Exception Handling for IA-64 site:static.usenix.org
EH newbies howto gcc.gnu.org
MinGW 64 bit Exception handling: SJLJ, DWARF, and SEH site:qt-project.org
Комментарии
RSS лента комментариев этой записи