2009-12-18 8 views
12

Est-il possible, en tout état de cause, de restaurer l'état d'un programme à ce qu'il était lors de la génération d'un fichier core?Restauration de l'état d'un programme à partir d'un fichier core

La raison pour laquelle je demande est que, pour profiter de la capacité de gdb à exécuter des fonctions et ainsi de suite, vous devez avoir une instance en cours d'exécution. Sûrement il devrait être possible de produire un faux processus du même exécutable avec l'état défini pour être le contenu du noyau?

Si non quelles alternatives sont là pour le genre de situation qui m'a donné envie de le faire en premier lieu? Dans ce cas, la trace arrière du noyau a conduit à une fonction de bibliothèque et j'ai voulu répliquer les entrées à cet appel de fonction mais l'une des entrées était un objet complexe qui pourrait facilement être sérialisé à une chaîne avec un appel de fonction dans un fonctionnement instance mais pas si dans une décharge de base.

Répondre

7

Il est théoriquement possible de faire exactement ce que vous voulez, mais (AFAICT) il n'y a pas de support pour cela dans GDB (encore).

Votre meilleur pari est d'utiliser GDB-7.0 et d'utiliser son script python intégré pour ré-implémenter la fonction de sérialisation.

+0

Merci - Je ne sais pas si les scripts Python seraient en mesure de faire ce que je veux, mais cela semble très utile tout de même. – cyborg

2

C'est ce qu'un fichier core fait déjà? Si vous chargez gdb avec l'exécutable d'origine et le fichier de base

gdb myprogram.exe -c mycorefile 

Ensuite, il ira au point où il est écrasé. Vous pouvez utiliser toutes les fonctionnalités d'inspection normales pour voir les variables, voir la trace de pile et ainsi de suite. Ou ai-je mal compris votre question?

+3

Vous ne pouvez pas exécuter de fonctions dans gdb lorsque vous déboguez un fichier core. Donc disons que j'ai un fichier core, localise une variable d'une classe complexe Foo et que je veux exécuter Foo.getSerialization() pour obtenir une belle représentation de chaîne simple que je ne peux pas parce que ce n'est pas un processus en cours d'exécution. Donc, la question est de savoir si on peut passer du noyau à un processus en cours. – cyborg

+1

Vous pouvez écrire du code pour créer de jolies valeurs d'impression gdb. Voir l'API Python ici (http://sourceware.org/gdb/current/onlinedocs/gdb/Python-API.html#Python-API). –

+0

@JeffFoster Je pense que ça n'aide vraiment pas, si vous voulez appeler une fonction live, ce n'est tout simplement pas possible. –