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.
Was ist mit GCC zu tun? 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 Release-Verteilung inakzeptabel, da die ausführbare Datei ziemlich groß werden kann.
Ich habe ein wenig gegoogelt und festgestellt, dass objcopy Debug-Symbole in eine separate Datei trennen kann, aber diese Seite implizierte, dass ich die Debug-Symbole neben der ausführbaren Version noch haben müsste, was wiederum offensichtlich inakzeptabel ist / p>
Ich konnte keine genaue Antwort darauf 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 Debug-Symbole 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.
Nun, die Idee ist, dass Sie mit -g
kompilieren, um Debug-Symbole hinzuzufügen, aber das Programm nicht verlangsamen, d. Die meisten Programme machen -g -O2
, dann können Sie Debug-Symbole mit objdump
trennen. Danach können Sie strip
Ihre Version erstellen, so dass es keine Debug-Symbole mehr haben wird.
Update: Aktuelle gdb unterstützt separate Debug-Dateien, siehe Ссылка
Zum Beispiel können Sie
doo %Vor% Jetzt hat Ihr prog
keine Debug-Symbole mehr. Aber Sie können proc.debug
-Datei verwenden, um es in gdb zu debuggen.
Tags und Links gcc debugging visual-c++