web-dev-qa-db-fra.com

Forcer un core à vider à partir d'un programme actif, fonctionnant normalement sur FreeBSD

J'écris du code de gestion des erreurs pour un serveur sur FreeBSD. Pour les erreurs extrêmement graves, je veux éviter la corruption des données en mettant fin immédiatement. C'est simple, exit(3). Avant de quitter, je génère mes variables pertinentes qui m'y ont conduit. Cependant, idéalement, cette résiliation serait accompagnée d'un .core afin que je puisse enquêter pleinement sur ce qui m'a amené à cet état catastrophique (et probablement difficile à reproduire).

Comment puis-je forcer cela à se produire?

27
Nektarios

kill -QUIT process_id provoquera un vidage de mémoire d'un processus en cours (en supposant que les limites de ressources le permettent).

Ou voir man 3 abort pour avoir provoqué le vidage d'un programme.

Ajouté: À partir d'un shell interactif, un programme en cours d'exécution peut être fait pour abandonner avec la touche Quitter, généralement Ctrl+\, qui envoie un SIGQUIT tout comme le plus commun Ctrl+C envoie un SIGINT. Ceci est identique au kill -QUIT… il est plus simple de taper si vous êtes sur le terminal de contrôle. Voir man 1 stty si votre clé de sortie par défaut est différente.

36
msw

This m'a aidé! kill -11 fonctionne toujours pour moi. 11 est SIGSEGV (référence de mémoire non valide)

3
Aadishri

Vous voudrez peut-être également jeter un œil à gcore (1) ( http://man.freebsd.org/gcore ).

Sur sles12 .. Le code ci-dessous a fonctionné pour moi:

kill -11

Les suggestions précédentes n'ont rien fait.

1
Marvin