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 pouvez déboguer tout programme compilé en code machine. D'autres disent que pour déboguer avec gdb vous devez compiler dans gcc avec l'indicateur -g . 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 pour les débogueurs autres que gdb. Clang a aussi un -g flag et la documentation disent simplement " générer des informations de débogage."

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

42
demandé sur Neil Traft 2014-01-15 12:13:36

1 réponses

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

C'est parce que les deux compilateurs génèrent des fichiers objet dans le même format (par exemple, sous Linux, les deux généreront des fichiers ELF avec DWARF debug info) et les deux débogueurs savent comment analyser ce format.

En pratique, les deux compilateurs introduisent des données dans les informations de débogage que seul leur débogueur respectif sait comment consommer. Cependant:

  1. les données générées par LLVM ne devraient en aucun cas gêner 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 Pas ajouter des données non standard . Par exemple, sous Linux, l'utilisation de -gdwarf-2 sur {[0] } ne devrait générer que DWARF conforme aux normes.

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

37
répondu Oak 2014-01-15 09:18:47