Comment gérer le signal SIGABRT ?

Comment gérer le signal SIGABRT ?

Comme d'autres l'ont dit, vous ne pouvez pas faire revenir abort() et permettre à l'exécution de se poursuivre normalement. Ce que vous pouvez faire cependant, c'est protéger un morceau de code qui pourrait appeler l'abandon par une structure semblable à une capture d'essai. L'exécution du code sera interrompue mais le reste du programme pourra continuer. Voici une démo :

#include <csetjmp>
#include <csignal>
#include <cstdlib>
#include <iostream>

jmp_buf env;

void on_sigabrt (int signum)
{
  signal (signum, SIG_DFL);
  longjmp (env, 1);
}

void try_and_catch_abort (void (*func)(void))
{
  if (setjmp (env) == 0) {
    signal(SIGABRT, &on_sigabrt);
    (*func)();
    signal (SIGABRT, SIG_DFL);
  }
  else {
    std::cout << "aborted\n";
  }
}    

void do_stuff_aborted ()
{
  std::cout << "step 1\n";
  abort();
  std::cout << "step 2\n";
}

void do_stuff ()
{
  std::cout << "step 1\n";
  std::cout << "step 2\n";
}    

int main()
{
  try_and_catch_abort (&do_stuff_aborted);
  try_and_catch_abort (&do_stuff);
}

Bien que vous puissiez remplacer le gestionnaire pour SIGABRT et abort() fera attention au gestionnaire, l'abandon n'est inhibé que si le gestionnaire de signal ne revient pas. La citation pertinente dans C99 se trouve au 7.20.4.1 paragraphe 2 :

Votre gestionnaire de signal revient et le programme est donc abandonné.


Vous obtenez ces symptômes, c'est-à-dire la boîte de dialogue de débogage contextuelle, lorsque vous avez une version de débogage (avec Windows et Visual Studio - je teste avec la version 2012), car elle définit une pause de débogage, dans l'implémentation de débogage de abort() ).If vous choisissez "ignorer" vous obtenez ce message "Déclencheur de fonction"

Si vous faites une version de version, vous n'obtenez pas la boîte de dialogue contextuelle de débogage et vous obtenez le message, comme prévu