Question

Je souhaite qu’un programme C produise un dépotoir central dans certaines circonstances. Il s'agit d'un programme qui s'exécute dans un environnement de production et qui n'est pas facilement arrêté et redémarré pour ajuster d'autres types de code de débogage. De plus, puisqu'il s'agit d'un environnement de production, je ne souhaite pas appeler abort (). Les problèmes à l'étude ne sont pas facilement reproduits dans un environnement hors production. Ce que je voudrais, c’est que le programme, lorsqu'il détecte certains problèmes, produise lui-même une image mémoire, avec de préférence suffisamment d’informations pour renommer le fichier, puis continuer.

Était-ce utile?

La solution

void create_dump(void)
{
    if(!fork()) {
        // Crash the app in your favorite way here
        abort() || (*((void*)0) = 42);
    }
}

Déclenchez le processus puis plantez l'enfant - il vous donnera un instantané à tout moment

Autres conseils

Une autre solution consiste à utiliser la bibliothèque Google Coredumper . Cela crée un résultat similaire à la technique fork + abort mais s’avère plus agréable avec les applications multithread (suspend tous les threads pendant un moment avant de forger pour qu’ils ne gâchent pas l’enfant).

Exemple:

    #include <google/coredumper.h>
    ...
    WriteCoreDump('core.myprogram');
    /* Keep going, we generated a core file,
     * but we didn't crash.
     */

Sun explique comment obtenir un fichier core sous Solaris, HP-UX, Redhat et Windows ici .

Solaris contient le programme gcore. HP-UX l’a peut-être. Sinon, utilisez gdb et sa commande gcore. Windows a win-dbg-root \ tlist.exe et win-dbg-root \ adplus.vbs

Voulez-vous vraiment un noyau ou juste un stacktrace? Si tout ce que vous voulez, c'est un stacktrace, vous pouvez jeter un coup d'œil au de la source ouverte et essayer d'intégrer le code à partir de là, ou peut-être simplement l'appeler à partir de la ligne de commande suffit.

Je pense que certains codes du projet gdb pourraient également être utiles.

Pensez également que gdb peut être associé à un processus en cours.

$ gdb /path/to/exec 1234 # 1234 is the pid of the running process

Le code source permettant de générer un core dump se trouve dans 'gcore', qui fait partie du package gdb.

De plus, le Soleil a gcore .

De plus, vous devez avoir un processus séparé exécutant le vidage principal, car le processus actuel doit être suspendu. Vous trouverez les détails dans la source du gcore ou vous pouvez simplement exécuter le gcore de votre plate-forme avec votre processus comme cible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top