2011-01-13 13 views
8

Ich habe ein Programm, das ich an Endbenutzer verteilen möchte und von diesen Absturzberichte erhalten möchte. Wenn ich MSVC verwenden würde, würde ich Minidumps generieren und diese an mich senden lassen und sie dann mit der entsprechenden PDB untersuchen, um zumindest einen nützlichen Stack-Trace zu erhalten.GCC-Äquivalent von PDBs

Was ist mit GCC? Ich kann einen Stack-Trace erzeugen, aber wenn ich möchte, dass dies nützlich ist, müssen Debug-Symbole in der ausführbaren Datei kompiliert werden (mit -g). Offensichtlich ist dies für die Freigabeverteilung inakzeptabel, da die ausführbare Datei ziemlich groß werden kann.

Ich googelte ein wenig und fand Verweise auf objcopy in der Lage, Debug-Symbole in eine separate Datei zu trennen, aber diese Seite implizierte, würde ich noch die Debug-Symbole neben der ausführbaren Release-Datei zur Verfügung haben, was wiederum offensichtlich inakzeptabel ist.

Antwort

5

Ich konnte keine genaue Antwort finden, aber ich fand eine alternative Lösung, die genauso gut funktioniert: Kompilieren Sie mit Optimierung und anderen Release-Flags neben -g, speichern Sie die resultierende ausführbare Datei irgendwo, und entfernen Sie dann Debugsymbole mit Strip . Senden Sie die abgestreifte ausführbare Datei, und wenn Sie eine Stack-Ablaufverfolgung erhalten, verwenden Sie addr2line in Kombination mit der ursprünglichen, nicht abgestreiften ausführbaren Datei, und Sie sollten alle Symbole zurück erhalten.

6

Nun ist die Idee, dass Sie mit -g kompilieren, um Debug-Symbole hinzuzufügen, aber das Programm nicht verlangsamen, dh. Die meisten Programme werden -g -O2 tun, dann können Sie Debug-Symbole mit objdump trennen. Danach können Sie strip Ihre Version erstellen, so dass es keine Debug-Symbole haben wird.

Update: Neue GDB unterstützt separate Debug-Dateien, https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html sehen

Zum Beispiel können Sie Ihre

objcopy --only-keep-debug prog prog.debug 
strip prog 

Jetzt prog haben keine Debug-Symbole doo können. Aber Sie können proc.debug Datei verwenden, um es in Gdb zu debuggen.

+0

Das ist gut und schön, aber wie kann ich einen Stack-Trace, der ohne Debug-Symbole erzeugt wurde (und damit nur Adressen enthält) später mit den getrennten Debug-Symbolen abgleichen, um einen Stack-Trace zu erhalten, den ich tatsächlich lesen kann? – pjohansson

+0

gdb kann separate Debug-Symbole verwenden Dies ist, wie Linux-Distributionen Debug aktivieren, siehe http://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html – ismail

+2

Diese Seite scheint ebenfalls die Debug-Informationen zu übernehmen ist auf dem Computer vorhanden, wo sich der Fehler manifestiert. Ich werde klarstellen: Wir können keine Debug-Informationen an unsere Kunden versenden. Es muss möglich sein, dass die Software eine Stack-Trace (ohne Debug-Symbole) erzeugt und diese Stack-Trace zu einem späteren Zeitpunkt ohne weitere Mitwirkung des Clients mit separaten Debug-Symbolen auf einem unserer Entwicklungsrechner abgeglichen wird. Ich sollte vielleicht auch klarstellen, dass dies eine Windows-Umgebung ist, keine * nix-eine. – pjohansson

Verwandte Themen