Welche Flags oder Umgebungsvariablen kann ich an Clang übergeben, um sowohl auf BSD als auch auf Linux ein Maximum an Debugging zu erhalten?

8

Ich bin an Antworten, Ansätzen und Ideen von Anfang an interessiert. Auf einer hohen Ebene ist die Hauptseite ziemlich spärlich und sie listen hauptsächlich -g mit einer Ebene auf, was darauf hindeutet, dass -O0 auch entweder sehr hilfreich oder wesentlich ist.

Aber ich frage mich, welche anderen clam-Flags gegeben werden können, um ein Maximum an Debugging zu ermöglichen. Gibt es ein Äquivalent zu% -ggdb3 von gcc, das einige der Quellen oder Anmerkungen direkt in der Objektausgabe enthält? Oder könnte es sein? Ist es möglich und hilfreich, das Betriebssystem und seine Originalbibliotheken neu zu kompilieren, um debuggen zu können (und wenn ja, wenn ich Debian verwende, kann ich das Debugging in das .deb Hauptpaket schreiben, anstatt ein separates debuggtes .deb Paket zu schreiben welche Debugging-Daten in /usr/lib/debug ?) speichert? Beeinflusst ein statischer Build einer Binärdatei die Fähigkeit, einen guten Stacktrace zu sehen? Und muss etwas getan werden, um sicherzustellen, dass addr2line gut funktioniert? Ist es notwendig, alle Bibliotheken (sogar glibc) mit clang zu kompilieren, um den maximalen Debuggenutzen zu erhalten? Ich stelle fest, dass es ein Projekt gibt, um Debian mit clang zu rekompilieren, und bin ansonsten offen für eine Distribution, die das tut, oder legt anderweitig Wert auf das Debugging.

Unter Linux gibt es auch Optionen wie LD_PRELOAD auf /lib/libSegFault.so oder% LD_LIBRARY_PATH auf /usr/lib/debug anstelle des normalen / usr / lib-Standorts (einschließlich der Umleitung von libc auf die debugged-Version) ). Gibt es einen zentralen Ort oder externe Quellen für Antworten auf diese Frage, wie die Debuggabilität einer Binärdatei verbessert werden kann? Das größere Mysterium ist clang, da ich in der langen gcc man-Seite sehe, dass es verschiedene Optionen gibt, die das Debuggen erhöhen können (oder Optimierungen reduzieren), aber andererseits zeigt die Dokumentation für clang nur einen kleineren Satz. Es ist möglich, dass clang mehr Optionen akzeptiert als angegeben, einschließlich gcc-Flags (die entweder zu einem No-Op oder zu mehr Debugging führen können - schwer zu erkennen ohne eine kanonische Informationsquelle).

Auch aus der Sicht eines Paket-Builds, da ein externes Paket CFLAGS möglicherweise nicht respektiert, habe ich /usr/bin/strip zu einem No-Op-Befehl umgeleitet, der immer erfolgreich ist, aber andere Ideen zur Sicherstellung der Konformität werden vorgeschlagen (ich glaube dass pkgsrc gc und den Linker in Shellskripten gut einpackt - nützlich, um obligatorische Flags einzufügen. Es kann auch verschiedene ld-Optionen geben, die übergeben werden können, um das Debuggen des ausgegebenen Ziels zu erhöhen. Es ist auch gut möglich, dass BSD (einschließlich FreeBSD 10, basierend auf Claming) eine andere Linking-Architektur haben, die es einfacher machen kann, in den generierten Bibliotheken und ausführbaren Dateien debuggte Symbole anzufordern und zu finden.

Um das Debuggen weiter zu definieren, habe ich LD_WARN=yes , LD_DEBUG=unused , SEGFAULT_SIGNALS="all" , LD_PRELOAD=.../libSegFault.so (wie oben erwähnt) und LD_BIND_NOW=yes gesetzt. Ich glaube auch, dass ich diese gcc-Suche nach Bibliotheken in / usr / lib / debug bevorzugen kann - über den Standard-Suchpfaden mit dem strategischen -B s. Außerdem kann die Verwendung von --whole-archive für einen statischen Build sicherstellen, dass mehr Objekte in der verknüpften Ausgabe enthalten sind. Es gibt auch ulimit -c unlimited und unter Linux eine gute Möglichkeit, Core-Dateien wie:

zu unterscheiden %Vor%

Für gcc habe ich Flags wie: -O0 -fno-omit-frame-pointer -fverbose-asm -ggdb3 -mno-omit-leaf-frame-pointer -mtune=generic -fvar-tracking -D_GLIBCXX_DEBUG=1 -frecord-gcc-switches -femit-class-debug-always -fmath-errno -fno-eliminate-unused-debug-symbols -fno-eliminate-unused-debug-types -fno-merge-debug-strings -mieee-fp -mtune=generic -static-libgcc -fexceptions -fvar-tracking -fbounds-check -rdynamic -UNDEBUG -DDEBUG=1 (-ffreestanding -static-libgcc -pass-exit-codes) -fno-stack-check verwendet und gesehen (da ich glaube, ich habe gelesen, dass letzteres Debugging stören kann)

Andere Flags gibt es aus anderen Gründen, aber die Betonung liegt auf maximalem Debugging. Bei allen oder den meisten der oben genannten Punkte ist es unklar, in welchem ​​Ausmaß der Clam sie unterstützen oder verwenden würde oder ob es andere Möglichkeiten gibt.

    
user3325588 20.03.2014, 16:44
quelle

1 Antwort

1

Clang unterstützt nicht das -ggdb3 Flag, nur -g , wie Sie bemerkt haben. Wenn Sie versuchen, es zu verwenden, erhalten Sie die Nachricht:

%Vor%

Sie können also Ihre gesamte Befehlszeile über Clang ausführen, und es wird Ihnen sagen, welche dieser GCC-Flags unterstützt wird und welche nicht, einige werden Warnungen ausgeben, andere können Fehler ausgeben, aber Clang ignoriert sie nicht stillschweigend. Hier sind die, die Clang abgelehnt hat, als ich deinen langen Befehl ausprobiert habe: -static-libgcc und -pass-exit-codes .

Wie bereits in einer weiteren SO-Antwort erwähnt, kann clang -cc1 --help verwendet werden, um unterstützte Kompilierungsflags aufzulisten, wo wir sehen Folgendes könnte für Sie von Interesse sein:

  • -disable-llvm-optzns : Führe keine LLVM-Optimierungsdurchläufe durch
  • -fno-elide-constructors : Deaktivieren Sie C ++ -Konstruktor Elision
  • -mdisable-fp-elim : Deaktivieren Sie die Optimierung der Rahmenzeiger-Eliminierung
Misha Brukman 18.05.2014 05:38
quelle

Tags und Links