Bonjour à tous,
Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
J'ai tout essayé, sans succès... Une idée ?
JKB
Bonjour à tous,
Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
J'ai tout essayé, sans succès... Une idée ?
JKB
Bonjour à tous,
Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
J'ai tout essayé, sans succès... Une idée ?
JKB
Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
JKB wrote in message :Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
Je pense que tu vas avoir du mal. Je me lance dans mes idées.
C'est valable dans le cas ELF. Il faut d'abord maper l'exécutable en mémoire
en accord avec ses entêtes ELF (objdump -h), puis la même chose avec le core
lui-même. Chercher dans le core la sauvegarde des registres, et les charger.
Puis laisser tourner.
Ce qui louze : tous l'environnement qui n'est pas en mémoire (masque et
gestionnaires de signaux, umask, limites...) est perdu. Les fd ne sont pas
restaurés (et si c'est une connexion réseau, c'est un peu mort), et d'autres
trucs de ce genre. Il y a peut-être dans le core quelques informations en
plus pour restaurer plus de choses, mais je ne les ai pas trouvées.
Je dirais qu'avec un peu de chance, ça peut marcher si le programme fait
uniquement du calcul en mémoire avec une sortie du résultat sur stdout, ou
alors s'il est possible de faire en sorte que le programme fasse lui-même sa
phase d'initialisation (fd, signaux), et ensuite s'arrête pour charger
lui-même son core (et dans ce cas, il n'y a que le core à charger, pas le
binaire, donc c'est plus facile).
JKB wrote in message <slrnd3lgg4.8dh.knatschke@rayleigh.systella.fr>:
Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
Je pense que tu vas avoir du mal. Je me lance dans mes idées.
C'est valable dans le cas ELF. Il faut d'abord maper l'exécutable en mémoire
en accord avec ses entêtes ELF (objdump -h), puis la même chose avec le core
lui-même. Chercher dans le core la sauvegarde des registres, et les charger.
Puis laisser tourner.
Ce qui louze : tous l'environnement qui n'est pas en mémoire (masque et
gestionnaires de signaux, umask, limites...) est perdu. Les fd ne sont pas
restaurés (et si c'est une connexion réseau, c'est un peu mort), et d'autres
trucs de ce genre. Il y a peut-être dans le core quelques informations en
plus pour restaurer plus de choses, mais je ne les ai pas trouvées.
Je dirais qu'avec un peu de chance, ça peut marcher si le programme fait
uniquement du calcul en mémoire avec une sortie du résultat sur stdout, ou
alors s'il est possible de faire en sorte que le programme fasse lui-même sa
phase d'initialisation (fd, signaux), et ensuite s'arrête pour charger
lui-même son core (et dans ce cas, il n'y a que le core à charger, pas le
binaire, donc c'est plus facile).
JKB wrote in message :Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
Je pense que tu vas avoir du mal. Je me lance dans mes idées.
C'est valable dans le cas ELF. Il faut d'abord maper l'exécutable en mémoire
en accord avec ses entêtes ELF (objdump -h), puis la même chose avec le core
lui-même. Chercher dans le core la sauvegarde des registres, et les charger.
Puis laisser tourner.
Ce qui louze : tous l'environnement qui n'est pas en mémoire (masque et
gestionnaires de signaux, umask, limites...) est perdu. Les fd ne sont pas
restaurés (et si c'est une connexion réseau, c'est un peu mort), et d'autres
trucs de ce genre. Il y a peut-être dans le core quelques informations en
plus pour restaurer plus de choses, mais je ne les ai pas trouvées.
Je dirais qu'avec un peu de chance, ça peut marcher si le programme fait
uniquement du calcul en mémoire avec une sortie du résultat sur stdout, ou
alors s'il est possible de faire en sorte que le programme fasse lui-même sa
phase d'initialisation (fd, signaux), et ensuite s'arrête pour charger
lui-même son core (et dans ce cas, il n'y a que le core à charger, pas le
binaire, donc c'est plus facile).
Bonjour à tous,
Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
J'ai tout essayé, sans succès... Une idée ?
Bonjour à tous,
Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
J'ai tout essayé, sans succès... Une idée ?
Bonjour à tous,
Une question me taraude l'esprit. J'ai une application qui génère à
la demande un core (sans s'interrompre, en fait). Le core est bon
puisqu'avec un débugger (ddd), j'arrive à voir que le pointeur
programme est au bon endroit, avec les bonnes variables... Donc tout
est parfait. Mais comment redémarrer ce truc au point où il en était
lors de la création du core ?
J'ai tout essayé, sans succès... Une idée ?
J'aimerais bien garder une image mémoire du processus car une copie
de tous les éléments risque de s'avérer fastidieuse.
J'aimerais bien garder une image mémoire du processus car une copie
de tous les éléments risque de s'avérer fastidieuse.
J'aimerais bien garder une image mémoire du processus car une copie
de tous les éléments risque de s'avérer fastidieuse.
En fait, le but est de pouvoir garder un instantané du déroulement
d'un programme. Je m'explique. J'ai écrit un langage de
programmation (pour faire des calculs justement), et certains
calculs tournent très longtemps. Le but du truc est de faire un dump
de la mémoire du processus (je sais faire, par contre, si quelqu'un
savait comment faire cette image sans envoyer un SIGQUIT...). Une
fois que ce dump est fait, j'aimerais pouvoir relancer l'exécutable
avec comme argument non pas mon script (rpl script.rpl), mais mon
image du processus (rpl -r core.script.rpl). A priori, je n'ai pas
problème d'initialisation ou d'environnement à restaurer, puisque le
wrapper s'en chargera. Ma première idée était de relancer un truc
comme gdb au travers d'un appel système execve(), mais je n'arrive
pas à trouver comment relancer ce programme.
J'aimerais bien garder une image mémoire du processus car une copie
de tous les éléments risque de s'avérer fastidieuse.
pour ceux que cela intéresse, le langage en question est sur
http://www.systella.fr/~bertrand/rpl2 (GPL).
Voilà mes besoins, je recherche une solution ;-)
En fait, le but est de pouvoir garder un instantané du déroulement
d'un programme. Je m'explique. J'ai écrit un langage de
programmation (pour faire des calculs justement), et certains
calculs tournent très longtemps. Le but du truc est de faire un dump
de la mémoire du processus (je sais faire, par contre, si quelqu'un
savait comment faire cette image sans envoyer un SIGQUIT...). Une
fois que ce dump est fait, j'aimerais pouvoir relancer l'exécutable
avec comme argument non pas mon script (rpl script.rpl), mais mon
image du processus (rpl -r core.script.rpl). A priori, je n'ai pas
problème d'initialisation ou d'environnement à restaurer, puisque le
wrapper s'en chargera. Ma première idée était de relancer un truc
comme gdb au travers d'un appel système execve(), mais je n'arrive
pas à trouver comment relancer ce programme.
J'aimerais bien garder une image mémoire du processus car une copie
de tous les éléments risque de s'avérer fastidieuse.
pour ceux que cela intéresse, le langage en question est sur
http://www.systella.fr/~bertrand/rpl2 (GPL).
Voilà mes besoins, je recherche une solution ;-)
En fait, le but est de pouvoir garder un instantané du déroulement
d'un programme. Je m'explique. J'ai écrit un langage de
programmation (pour faire des calculs justement), et certains
calculs tournent très longtemps. Le but du truc est de faire un dump
de la mémoire du processus (je sais faire, par contre, si quelqu'un
savait comment faire cette image sans envoyer un SIGQUIT...). Une
fois que ce dump est fait, j'aimerais pouvoir relancer l'exécutable
avec comme argument non pas mon script (rpl script.rpl), mais mon
image du processus (rpl -r core.script.rpl). A priori, je n'ai pas
problème d'initialisation ou d'environnement à restaurer, puisque le
wrapper s'en chargera. Ma première idée était de relancer un truc
comme gdb au travers d'un appel système execve(), mais je n'arrive
pas à trouver comment relancer ce programme.
J'aimerais bien garder une image mémoire du processus car une copie
de tous les éléments risque de s'avérer fastidieuse.
pour ceux que cela intéresse, le langage en question est sur
http://www.systella.fr/~bertrand/rpl2 (GPL).
Voilà mes besoins, je recherche une solution ;-)
JKB wrote in message :J'aimerais bien garder une image mémoire du processus car une copie
de tous les éléments risque de s'avérer fastidieuse.
Je me doutais un peu que c'était ce genre de projet. Je pense qu'il vaut
mieux se taper une bonne fois pour toutes la sérialisation de toutes les
structures de données de l'interpréteur plutôt que laisser ce boulot à l'OS.
C'est peut-être un gros boulot au début, mais :
- ce sera infiniment plus fiable et plus portable, donc moins de boulot de
maintenance ;
- ça permet quelques avantages intéressants si c'est bien fait, comme le
fait de pouvoir continuer le programme sur une autre architecture ou de
corriger un bug sur la fin du programme quand c'est une portion qui n'a
pas encore été exécutée.
JKB wrote in message <slrnd3lm9r.8dh.knatschke@rayleigh.systella.fr>:
J'aimerais bien garder une image mémoire du processus car une copie
de tous les éléments risque de s'avérer fastidieuse.
Je me doutais un peu que c'était ce genre de projet. Je pense qu'il vaut
mieux se taper une bonne fois pour toutes la sérialisation de toutes les
structures de données de l'interpréteur plutôt que laisser ce boulot à l'OS.
C'est peut-être un gros boulot au début, mais :
- ce sera infiniment plus fiable et plus portable, donc moins de boulot de
maintenance ;
- ça permet quelques avantages intéressants si c'est bien fait, comme le
fait de pouvoir continuer le programme sur une autre architecture ou de
corriger un bug sur la fin du programme quand c'est une portion qui n'a
pas encore été exécutée.
JKB wrote in message :J'aimerais bien garder une image mémoire du processus car une copie
de tous les éléments risque de s'avérer fastidieuse.
Je me doutais un peu que c'était ce genre de projet. Je pense qu'il vaut
mieux se taper une bonne fois pour toutes la sérialisation de toutes les
structures de données de l'interpréteur plutôt que laisser ce boulot à l'OS.
C'est peut-être un gros boulot au début, mais :
- ce sera infiniment plus fiable et plus portable, donc moins de boulot de
maintenance ;
- ça permet quelques avantages intéressants si c'est bien fait, comme le
fait de pouvoir continuer le programme sur une autre architecture ou de
corriger un bug sur la fin du programme quand c'est une portion qui n'a
pas encore été exécutée.
Bon, donc si j'ai bien compris, je suis contraint de me taper tout
le truc à la main... Vu les structures de données, je vais m'amuser
:-(
Bon, donc si j'ai bien compris, je suis contraint de me taper tout
le truc à la main... Vu les structures de données, je vais m'amuser
:-(
Bon, donc si j'ai bien compris, je suis contraint de me taper tout
le truc à la main... Vu les structures de données, je vais m'amuser
:-(
En fait, le but est de pouvoir garder un instantané du déroulement
d'un programme. Je m'explique. J'ai écrit un langage de
programmation (pour faire des calculs justement), et certains
calculs tournent très longtemps. Le but du truc est de faire un dump
de la mémoire du processus (je sais faire, par contre, si quelqu'un
savait comment faire cette image sans envoyer un SIGQUIT...). Une
fois que ce dump est fait, j'aimerais pouvoir relancer l'exécutable
avec comme argument non pas mon script (rpl script.rpl), mais mon
image du processus (rpl -r core.script.rpl).
Voilà mes besoins, je recherche une solution ;-)
En fait, le but est de pouvoir garder un instantané du déroulement
d'un programme. Je m'explique. J'ai écrit un langage de
programmation (pour faire des calculs justement), et certains
calculs tournent très longtemps. Le but du truc est de faire un dump
de la mémoire du processus (je sais faire, par contre, si quelqu'un
savait comment faire cette image sans envoyer un SIGQUIT...). Une
fois que ce dump est fait, j'aimerais pouvoir relancer l'exécutable
avec comme argument non pas mon script (rpl script.rpl), mais mon
image du processus (rpl -r core.script.rpl).
Voilà mes besoins, je recherche une solution ;-)
En fait, le but est de pouvoir garder un instantané du déroulement
d'un programme. Je m'explique. J'ai écrit un langage de
programmation (pour faire des calculs justement), et certains
calculs tournent très longtemps. Le but du truc est de faire un dump
de la mémoire du processus (je sais faire, par contre, si quelqu'un
savait comment faire cette image sans envoyer un SIGQUIT...). Une
fois que ce dump est fait, j'aimerais pouvoir relancer l'exécutable
avec comme argument non pas mon script (rpl script.rpl), mais mon
image du processus (rpl -r core.script.rpl).
Voilà mes besoins, je recherche une solution ;-)
JKB a écrit le Vendredi 18 Mars 2005 14:35 :En fait, le but est de pouvoir garder un instantané du déroulement
d'un programme. Je m'explique. J'ai écrit un langage de
programmation (pour faire des calculs justement), et certains
calculs tournent très longtemps. Le but du truc est de faire un dump
de la mémoire du processus (je sais faire, par contre, si quelqu'un
savait comment faire cette image sans envoyer un SIGQUIT...). Une
fois que ce dump est fait, j'aimerais pouvoir relancer l'exécutable
avec comme argument non pas mon script (rpl script.rpl), mais mon
image du processus (rpl -r core.script.rpl).
Voilà mes besoins, je recherche une solution ;-)
Et en s'inspirant des systèmes de mise en veille des portables (hibernate,
suspend ...) ?
JKB a écrit le Vendredi 18 Mars 2005 14:35 :
En fait, le but est de pouvoir garder un instantané du déroulement
d'un programme. Je m'explique. J'ai écrit un langage de
programmation (pour faire des calculs justement), et certains
calculs tournent très longtemps. Le but du truc est de faire un dump
de la mémoire du processus (je sais faire, par contre, si quelqu'un
savait comment faire cette image sans envoyer un SIGQUIT...). Une
fois que ce dump est fait, j'aimerais pouvoir relancer l'exécutable
avec comme argument non pas mon script (rpl script.rpl), mais mon
image du processus (rpl -r core.script.rpl).
Voilà mes besoins, je recherche une solution ;-)
Et en s'inspirant des systèmes de mise en veille des portables (hibernate,
suspend ...) ?
JKB a écrit le Vendredi 18 Mars 2005 14:35 :En fait, le but est de pouvoir garder un instantané du déroulement
d'un programme. Je m'explique. J'ai écrit un langage de
programmation (pour faire des calculs justement), et certains
calculs tournent très longtemps. Le but du truc est de faire un dump
de la mémoire du processus (je sais faire, par contre, si quelqu'un
savait comment faire cette image sans envoyer un SIGQUIT...). Une
fois que ce dump est fait, j'aimerais pouvoir relancer l'exécutable
avec comme argument non pas mon script (rpl script.rpl), mais mon
image du processus (rpl -r core.script.rpl).
Voilà mes besoins, je recherche une solution ;-)
Et en s'inspirant des systèmes de mise en veille des portables (hibernate,
suspend ...) ?