web-dev-qa-db-fra.com

Est-il possible de déboguer un programme compilé par gcc en utilisant lldb, ou de déboguer un programme compilé par clang en utilisant gdb?

(Préface: Je suis assez nouveau en C/C++ et je ne sais pas vraiment comment fonctionne le débogage en code natif.)

Certaines sources disent que gdb et lldb peuvent déboguer tout programme compilé en code machine . D'autres disent que pour déboguer avec gdb vous devez compiler dans gcc avec le -g flag . La documentation de gcc elle-même suggère que c'est facultatif, et qu'en fait si vous l'utilisez, cela peut causer des problèmes aux débogueurs autre que gdb. Clang a également un -g flag et la documentation dit simplement "Générer des informations de débogage".

Ces débogueurs sont-ils donc limités à leurs propres chaînes d'outils (GNU et LLVM), ou sont-ils en quelque sorte indépendants du compilateur utilisé?

49
Neil Traft

En théorie, vous devriez pouvoir déboguer un programme construit avec GCC avec lldb et un programme construit avec LLVM avec gdb. Dans les deux cas, vous devez compiler avec -g.

En effet, les deux compilateurs génèrent des fichiers objets dans le même format (par exemple, sous Linux, les deux généreront ELF fichiers avec NAIN informations de débogage) et les deux débogueurs savent comment analyser ce format.

En pratique, les deux compilateurs poussent certaines données dans les informations de débogage que seul leur débogueur respectif sait comment utiliser. Toutefois:

  1. Les données générées par LLVM ne doivent en aucun cas entraver gdb.
  2. Les données générées par GCC ne devraient pas entraver lldb, mais si c'est le cas, vous pouvez spécifiquement demander à gcc de ne pas ajouter des données non standard . Par exemple, sous Linux, en utilisant -gdwarf-2 plus de -g ne devrait générer que des fichiers DWARF conformes aux normes.

Notez que vous pouvez également déboguer des programmes sans informations de débogage (non compilés avec -g), mais vous serez limité aux informations de bas niveau dans le débogueur - Code d'assemblage, mémoire et registres - et vous ne pourrez pas voir les constructions de haut niveau telles que les numéros de ligne, les noms de fonction, le mappage entre les noms de variables et leurs contenu, etc.

40
Oak