En ce qui concerne la première question : What are the scenarios where a process gets a SIGABRT in C++?
Je peux penser à deux cas particuliers où un programme C++ est interrompu automatiquement -- no en appelant directement std::abort()
o std::terminate()
:
Un : Lancer une exception pendant qu'une exception est en cours de traitement.
try {
throw "abc";
}
catch (...) {
throw "def"; // abort here
}
Deux : Une exception non attrapée qui tente de se propager en dehors de main()
.
int main(int argc, char** argv)
{
throw "abc"; // abort here
}
Les experts du C++ pourraient probablement citer d'autres cas particuliers.
Ces pages de référence contiennent également de nombreuses informations utiles :
7 votes
Il y a plusieurs façons de procéder. La plus simple, si vous avez écrit le programme, est d'enregistrer un gestionnaire de signal pour SIGABRT qui imprime cette information et vide ses flux avant de revenir. La deuxième façon la plus simple est d'exécuter le programme dans strace. Le troisième moyen le plus simple est de s'assurer que le programme génère un fichier core lorsqu'il se plante, et de le découvrir via le core dump.