Wie Speicherzugriffsfehler aufspüren?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MoonKid
User
Beiträge: 106
Registriert: Mittwoch 10. Dezember 2014, 16:24

Derzeit kann ich reproduzierbar einen "Speicherzugriffsfehler" auslösen. Ich komme aber nicht dahinter, woran es liegen könnte.

Welche Möglichkeiten habe ich nun? Wie spürt man solche Fehler auf? Welche Tools könnte man empfehlen?

Wie ist eigentlich die exakte englische Übersetzung für den Begriff - als Web Suchwort? "memory access error"?
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MoonKid: Wenn Du den reproduzierbar auslösen kannst, dann müsste sich doch auch eingrenzen lassen was den letztendlich auslöst. So ganz allgemein kann man nur sagen: Code auskommentieren oder durch Mocks ersetzen um den Auslöser einzugrenzen. Und oder das `trace`-Modul verwenden um zu schauen was da bis wohin ausgeführt wird. Oder mit einem Debugger Schrittweise durch den Code gehen bis man zum Absturz kommt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

@MoonKid: Wenn der Segfault in C-Code auftritt, hilft es eventuell auch, Python mit ASan-Support zu kompilieren:

Code: Alles auswählen

./configure --with-assertions --with-address-sanitizer --with-undefined-behavior-sanitizer --with-pydebug ...
Wenn du Glück hast, zeigt dir das direkt an, wo es kracht (und auch, wo der Speicher alloziert wurde). Valgrind (`--with-valgrind`) ist auch noch eine Möglichkeit.

Für den Debugger sind Debug-Symbole hilfreich, die gibt’s z. B. unter Ubuntu im Paket `python3-dbg`.

Die englische Übersetzung ist „segmentation fault“ oder „access violation“.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich benutze für sowas den GDB. Mit dem Python zu starten zeigt üblicherweise an, wo es kracht - zumindest gut genug. Also welche Bibliothek, welcher Aufruf darin.
MoonKid
User
Beiträge: 106
Registriert: Mittwoch 10. Dezember 2014, 16:24

Es ist "0x00007ffff407e2c0 in ?? () from /usr/lib/x86_64-linux-gnu/libgtk-3.so.0".

Ich vermute mal, dass ich Gtk misverstehe und falsch einsetze. Ich werde versuchen es in einem MWE zu reproduzieren und dann in der Gtk Community fragen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst auch probieren debug-Symbole fuer libgtk zu installieren, und dann sagt er ggf. noch genauer, wo's kracht. Klassiker: du erzeugst ein widget, aber haelst es nicht fest, es wird garbage collected, aber die C-Schicht hat das nicht mitbekommen.
Antworten