2009-06-27 13 views
2

J'essaye d'implémenter une fonction pour recaler un processus d'espace utilisateur écrasé dans le noyau. Depuis, je travaille dans le noyau, je n'ai pas le luxe de toutes les bibliothèques et la fonction backtrace fournie ne supporte pas l'architecture MIPS. Je me demande simplement si je peux imiter ce que GDB fait. La version du noyau est 2.6.21.Comment GDB trouve-t-il le symbole d'une fonction lors d'un retour en arrière dans MIPS Linux?

+0

Voulez-vous dire 2.6.21? Aussi, pourquoi ne pas faire un core dump? – bdonlan

+0

vous avez raison. changer 6.2.21 à 2.6.21 – Quincy

+0

un vidage de base serait généré à ce stade. ce que je suis en train de mettre en œuvre ici est une amélioration. "Pour améliorer l'expérience de débogage" si vous voulez. – Quincy

Répondre

1

Je pense que vous pouvez faire référence à l'implémentation de oprofile. Oprofile utilise frame-pointer pour obtenir l'information de trace arrière, donc il nécessite les applications espace utilisateur et ses bibliothèques associées toutes construites avec frame-pointer activé (option "- fno-omit-frame-pointer"). Une autre façon est que si les applications utilisateur contiennent des informations de débogage, vous devrez peut-être vérifier les informations de l'application utilisateur DWARF, l'information de trame d'appel DWARF fournit au débogueur suffisamment d'informations sur la façon dont une fonction est appelée. les arguments de la fonction, localiser la trame d'appel actuelle et localiser la trame d'appel pour l'information d'appel. Si vous voulez explorer simplement l'information de trace arrière sans "frame-pointer" supporté ou aucune information de débogage, alors vous devez vérifier l'instruction mips de l'application utilisateur, faire une boucle sur les choses contextuelles de l'enfant (SP, IP, RP) obtenir le contexte parent (SP, IP, RP) par la spécification mips ABI, ceci est un peu compliqué et prend beaucoup de temps puisqu'il faut démonter de nombreuses instructions dans la mémoire, mais ça marche pas mal. Par exemple, pour beaucoup de routines, il y a une instruction "add sp, sp, -32" au début, et vous saurez que le parentp est sp plus 32. 32.

La deuxième et la troisième façon devez l'implémenter vous-même puisque vous travaillez dans le noyau.

+0

En fait, j'ai fait quelques recherches sur votre troisième option. Disons que la pile est déroulée, comment devrait-on imprimer les noms des fonctions, puisque nous n'aurions que l'adresse mémoire de la fonction? – Quincy

+0

@Quincy: analyser le fichier elf de l'application utilisateur, et vous obtiendrez sa table de symboles. Mais si vous voulez analyser l'elf dans le noyau, comme le binaire peut être partiellement chargé dans la mémoire physique, vous pouvez impliquer une gestion des erreurs de page qui peut charger/échanger des éléments mémoire, si cela se produit, cela peut échouer. Ou vous pouvez essayer charger la table de symboles au programme est en train de charger –

+0

@Quincy: pour la troisième façon, je connais un travail fait pour MIPS ramper avec des adresses et envoyé à l'application de l'utilisateur qui analysent la fin binaire apparente symbole, mais pour le montrer dans le style printk du noyau, je n'ai pas vu. –

1

Le fichier principal se trouve dans ELF format. Ceci est une norme, qui est disponible sur de nombreux sites Web juste un google loin. CEPENDANT, ce format de fichier est non-trival. Beaucoup de bizarreries et de bits. Toute personne raisonnable devrait utiliser une bibliothèque tierce. Si vous voulez vraiment faire cela, commencez par vous-même et lisez-le. et vous souhaite bonne chance.

+0

Je veux juste clarifier. Je ne travaille pas avec les fichiers core. Je veux revenir en arrière lorsque le processus utilisateur se bloque dans le noyau. – Quincy