w64 support para for descargar descarga compiler c++ c qt mingw

c++ - support - ¿Cuál es la diferencia entre MinGW SEH y MinGW SJLJ?



matlab support for mingw w64 c c++ compiler (2)

Descubrí una diferencia entre el manejo de excepciones SJLJ y SEH en MinGW-w64: los manejadores de señales establecidos por la función signal () no funcionan en la versión SJLJ tan pronto como al menos un bloque try {} se ejecuta en el tiempo de ejecución. Ya que este problema no parece ser descrito en ninguna parte, lo estoy poniendo aquí para el registro.

El siguiente ejemplo (test_signals.cpp) demuestra esto.

// This sample demonstrates how try {} block disables handler set by signal() // on MinGW-w64 with GCC SJLJ build #include <signal.h> #include <iostream> int izero = 0; static void SIGWntHandler (int signum)//sub_code) { std::cout << "In signal handler, signum = " << signum << std::endl; std::cout << "Now exiting..." << std::endl; std::exit(1); } int main (void) { std::cout << "Entered main(), arming signal handler..." << std::endl; if (signal (SIGSEGV, (void(*)(int))SIGWntHandler) == SIG_ERR) std::cout << "signal(OSD::SetSignal) error/n"; if (signal (SIGFPE, (void(*)(int))SIGWntHandler) == SIG_ERR) std::cout << "signal(OSD::SetSignal) error/n"; if (signal (SIGILL, (void(*)(int))SIGWntHandler) == SIG_ERR) std::cout << "signal(OSD::SetSignal) error/n"; // this try block disables signal handler... try { std::cout << "In try block" << std::endl; } catch(char*) {} std::cout << "Doing bad things to cause signal..." << std::endl; izero = 1 / izero; // cause integer division by zero char* ptrnull = 0; ptrnull[0] = ''/0''; // cause access violation std::cout << "We are too lucky..." << std::endl; return 0; }

Construye con:

g++ test_signals.cpp -o test_signals.exe

La salida esperada es:

Entered main(), arming signal handler... In try block Doing bad things to cause signal... In signal handler, signum = 8 Now exiting...

La salida real cuando construyo con MigGW-w64 SJLJ variante es:

Entered main(), arming signal handler... In try block Doing bad things to cause signal...

La aplicación termina en silencio después de algún retraso. Es decir, el manejador de señal no se llama. Si el bloque try {} está comentado, el manejador de señales se llama correctamente.

Cuando se usa la variante SEH de MinGW-w64, se comporta como se espera (se llama al manejador de señales).

No tengo una idea clara de por qué ocurre este problema, por lo tanto, estaré agradecido si alguien puede dar una explicación.

Estoy empezando a aprender C y ahora estoy instalando QT x64 (aquí: http://tver-soft.org/qt64 ). Tengo dos opciones para instalar: MinGW 4.9.2 SEH o MinGW 4.9.2 SJLJ .
Pregunta: ¿Qué es mejor instalar y por qué?

Leí ¿Cuál es la diferencia entre sjlj vs dwarf vs seh? y https://wiki.qt.io/MinGW-64-bit#Exception_handling:_SJLJ.2C_DWARF.2C_and_SEH pero no entiendo nada (nuevo en C y compiller languages).


SJLJ y SEH son dos sistemas de manejo de excepciones diferentes.

Para las diferencias específicas, los recursos que ya has visto cubren todo.

Sin embargo, en cuanto a cuál es mejor instalar, vaya con SJLJ a menos que sepa que necesita SEH.

Actualización de 2019: En los sistemas modernos, no hay ninguna razón para usar SJLJ, por lo que probablemente se deben cambiar los consejos anteriores. SEH es más común ahora. Sin embargo, en última instancia, en realidad no importa, ya que es fácil cambiar entre los dos.

SJLJ

SJLJ es más compatible con todas las arquitecturas y es más robusto. Además, las excepciones SJLJ se pueden lanzar a través de bibliotecas que utilizan otros sistemas de manejo de excepciones, incluidas las bibliotecas de C. Sin embargo, tiene una penalización de rendimiento.

SEH

SEH es mucho más eficiente (sin penalización de rendimiento), pero desafortunadamente no está bien soportado. Las excepciones de SEH harán que ocurran cosas malas cuando se lanzan a través de bibliotecas que no usan también SEH.

En lo que respecta a su código, no hay diferencias reales. Siempre puedes cambiar los compiladores más tarde si lo necesitas.