C++ stacktraces

OP #7534999
Lesenswert?
• ▲
▼

Ich möchte in einem Handler gerne sinnvolle stacktraces generieren. Im Moment passiert das mit boost stacktrace, was auch funktioniert. Allerdings möchte ich meine executables in Zukunft nicht mehr mit allen Debuginformationen ausliefern. Erstens erschwert es reverse engineering und zweitens macht es das kleiner. Dabei gehen natürlich lesbare stacktraces verloren.

Es sind dann nur noch frame pointer vorhanden, die ich wieder in Funktionen übersetzen muss. Hat jemand dazu eine Idee. Ich habe mir mal breakpad oder crashpad angesehen aber das ist zu viel Aufwand. Ideal wäre ein kleines tool, dass mit einen stacktrace ausgeben kann.

Gast #7535024
Lesenswert?
• ▲
▼

Ich verwende Microsoft Visual Studio, da ist die Debug Info getrennt von der exe in einem PDB File (wird per default erzeugt) - ohne das PDB kannst du nur in ASM debuggen. Das Linker Flag /pdbstripped entfernt noch zusätzliche private Infos aus der exe. Die MiniDumpWriteDump Funktion schreibt dir ein Dump File mit spezifischen Einstellungen, oder du nimmst die Default Einstellungen von Windows Error Reporting, die bei einem Program Crash ein Dump File erzeugt. Siehe hier: https://learn.microsoft.com/de-de/windows/win32/wer/collecting-user-mode-dumps

OP #7535031
Lesenswert?
• ▲
▼

Udo K. schrieb:

Ich verwende Microsoft Visual Studio, da ist die Debug Info getrennt von der exe in einem PDB File (wird per default erzeugt) - ohne das PDB kannst du nur in ASM debuggen. Das Linker Flag /pdbstripped entfernt noch zusätzliche private Infos aus der exe. Die MiniDumpWriteDump Funktion schreibt dir ein Dump File mit spezifischen Einstellungen, oder du nimmst die Default Einstellungen von Windows Error Reporting, die bei einem Program Crash ein Dump File erzeugt. Siehe hier: https://learn.microsoft.com/de-de/windows/win32/wer/collecting-user-mode-dumps

Was wäre denn die Linux Variante das zu machen?

OP #7535059
Lesenswert?
• ▲
▼

Oliver schrieb:

Gustav G. schrieb:

Was wäre denn die Linux Variante das zu machen?

Das Programm mit debug symbols zu bauen und dann mit objcopy die Debugsymbole in eine eigene Datei abspalten.

https://sourceware.org/gdb/current/onlinedocs/gdb.html/Separate-Debug-Files.html verrät dir alle Details.

Danke. Das hilft schonmal. Wenn ich debuggen will und ein core file habe ist das so möglich. Ich habe allerdings nur den Stacktrace mit adressen und kann später nichts mehr debuggen. Alle corefiles zu behalten würde sehr viel speicher nehmen.

#7535129
Lesenswert?
• ▲
▼

Gustav G. schrieb:

Ich habe allerdings nur den Stacktrace mit adressen und kann später nichts mehr debuggen.

Aber du kannst dein Programm in den gdb mit Debug Informationen laden und dann mit

1
 info line *<addr>

die Adresse in die Zeile konvertieren. Außerdem gibt es noch das Programm addr2line https://linux.die.net/man/1/addr2line welches mithilfe der Separaten Debugg Informationen die Adresse in Zeilennummern übersetzt.

Persönliche Seite #7535415
Lesenswert?
• ▲
▼

Gustav G. schrieb:

Was wäre denn die Linux Variante das zu machen?

#include <backtrace.h> und backtrace()?

https://linux.die.net/man/3/backtrace

Das setzt allerdings voraus, dass du die Möglichkeit hast das aufzurufen, etwa in einer eigenen fatal() Funktion. Evtl. entsprechende Signals implementieren.

Dann gibt's auch backtrace_symbols(), allerdings braucht das malloc(), was man in so einem Handler nicht unbedingt haben will.

backtrace_symbols_fd() braucht kein malloc(), schreibt aber auf einen File Descriptor; ist also auch nicht 100% unproblematisch mit schlechterer Usability. Kann aber auch nützlich nein, wenn der Kunde einem "nur" crash.txt zusenden muss.

Und addr2line wurde ja schon genannt.

Um kleineres Binary ohne Debug- oder Symbolinfo zu erhalten geht auch strip oder strip -g etc.

https://linux.die.net/man/1/strip

Ansonten ist das Binary gleich, und die ungestrippte Version kannst du behalten.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.