2010-08-26 3 views
4

Je cherche à écrire un outil qui vise à convertir les symboles de débogage d'un format vers un autre format compatible avec GDB. Cela semble être un projet fastidieux et potentiellement complexe, donc je ne sais pas trop comment le résoudre. Intially je vise à convertir la table Turbo Debug Symbol (TDS) émise par les compilateurs Borland en quelque chose comme stabs ou format nain (semble que nain est préféré de mes recherches). Mais idéalement, je veux que mon outil soit suffisamment facile à étendre pour pouvoir convertir d'autres formats plus tard. par exemple. codeview4 ou peut-être même pdb.Suggestions pour écrire un outil de conversion de format de débogage

Ma principale motivation pour créer ce sont:

  • interopérabilité. Si je peux convertir un format de débogage étranger dans une forme gdb peut fonctionner avec le débogage au niveau de la source serait possible sur les binaires compilés à partir d'un autre compilateur que gcc. Cela signifie que toute interface de débogage de frontend qui utilise gdb comme backend fonctionnera aussi bien.
  • Aucun autre outil n'existe. J'ai fait un google cherchant des outils similaires et le plus proche que j'ai trouvé est tds2dbg. Mais ça ne fait pas tout à fait ce que je cherche.

Ce que je dois travailler avec au moment:

  • J'ai déjà un debug hook API qui peut comprendre le format de débogage TDS. Je peux l'utiliser pour m'aider à obtenir les informations nécessaires à partir du format source que je convertis.
  • Pour la portée de ce projet, je m'intéresse principalement à ce que cela fonctionne dans l'environnement win32. D'autres plateformes et outils ne me préoccupent pas vraiment.
  • Le format de débogage nain cible que je convertis. Celui-ci, je ne suis vraiment pas familier du tout. J'ai utilisé des compilateurs portés par gcc comme MinGW avant et les ai débugués avec gdb avec le format de nain. Mais je n'ai aucune idée de la façon dont ce format est implémenté sur Windows.

Le dernier point est celui qui me préoccupe. Je suis en train de lire la documentation sur les spécifications naines, mais je trouve que j'ai du mal à vraiment comprendre et comprendre comment cela fonctionne. Il y a tellement de détails dedans mais en même temps il n'a pas de détails sur la façon dont nain est implémenté sur les fichiers objets et les fichiers image sur une plateforme qui n'utilise pas ELF nativement - à savoir le format PE-COFF utilisé par Windows . La documentation est aussi une lecture très sèche, de longues phrases la rendent difficile à comprendre et les diagrammes et illustrations sont rares. Je suis tombé sur une API appelée libDwarf qui devrait prendre la plupart du travail d'analyse du nain d'interprétation. Le problème est que j'essaie toujours de le construire et je ne sais pas encore comment cela fonctionnera.

Je n'ai pas encore écrit de code car je ne comprends pas vraiment ce que j'ai besoin de construire. J'ai le sentiment que le plus gros défi sera de trouver comment travailler avec le nain en raison de sa complexité. Googling pour obtenir des informations sur la façon dont fonctionne nain sous Windows n'a pas non plus été utile. Comme par exemple, il n'y a pas d'informations sur le code 'colle' qui est nécessaire pour contenir le nain dans un fichier d'image PE exécutable. Comment les sections naines sont-elles disposées exactement? Y a-t-il des informations d'en-tête pour chaque section? GDB ne prend pas simplement un fichier de débogage nain «brut» et l'utilise tel quel. Alors, quel type de format attend gdb du fichier de débogage pour qu'il puisse fonctionner avec lui?

Ma question est, comment puis-je commencer sur un tel projet? Plus important encore, où puis-je demander de l'aide quand je suis inévitablement coincé sur un problème?

+0

Avez-vous déjà commencé sur cette page? J'ai aussi parfois trouvé le besoin d'un outil comme vous le décrivez. –

+1

Pas vraiment, malheureusement, le manque de spécification compréhensible pour le format nain était un gros défaut pour moi. Heureusement, quelqu'un a forké gdb et a ajouté un support tds rudimentaire, donc je n'ai pas vraiment besoin de: [gdbwtds] (http://sourceforge.net/projects/gdbwtds). Cela étant dit, vous pourriez trouver [pyelftools] (https://github.com/eliben/pyelftools) utile, bien qu'il semble seulement soutenir la lecture et l'analyse mais pas la génération de symboles. – greatwolf

Répondre

1

Vous posez plusieurs questions ici :-)

  1. Je pense que vous êtes dans la bonne direction, en utilisant libdwarf. MAIS, avez-vous jeté un oeil à objcopy pour voir si cet outil peut faire une partie du travail pour vous? Il ne prend probablement pas en charge borland, pdb ou codeview4, mais cela pourrait valoir la peine d'être examiné. (Une autre approche peut être d'étendre objcopy pour prendre en charge les formats que vous essayez de convertir entre.)

  2. J'ai parfois utilisé la liste de diffusion dwarf-discuss lorsque je suis bloqué. http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org

  3. En ce qui concerne les questions sur nain, les diviser en questions distinctes et je ferai de mon mieux pour y répondre . :-)

+0

Merci pour la réponse. Je pensais que cette question allait juste être enterrée et perdue ici: P – greatwolf

2

accepteur d'Assembleur pour Windows

accepteur d'Assembleur est un x86/assembleur x86-64 pour Windows qui prend source d'assemblage GAS-syntaxe des informations de débogage NAIN et génère des sections correspondantes de format CodeView dans le fichier objet afin de rendre le programme lié débogage dans Visual Studio. Ce programme est bon pour les utilisateurs de Cygwin et MinGW pour porter le code Linux sur Windows.

http://www.affinic.com/?page_id=48

+0

n'a pas entendu parler de cet assembleur avant mais je vais certainement le vérifier. Merci – greatwolf

+0

@VictorT. Avez-vous eu l'occasion d'essayer ce débogueur? Comment était-ce? – Paul

Questions connexes