Plus, Das Programm läuft auf einem Arm-Gerät unter Linux, ich kann Stapelinformationen ausdrucken und Werte in dem zugewiesenen Sig-Seg-Handler registrieren. Das Problem ist, dass ich die Option -g nicht zur Quelldatei hinzufügen kann, da der Fehler möglicherweise aufgrund eines Downgrades der Leistung nicht reproduziert wird.Woher weiß ich, auf welche illegale Adresse das Programm zugreift, wenn ein Segmentierungsfehler auftritt?
Antwort
Kompilieren mit der -g
Option zu gcc
tut nicht verursachen eine "Leistungsreduzierung". Es bewirkt nur, dass Debugging-Symbole eingefügt werden. es tut nicht beeinflussen die Optimierung oder Code-Generierung.
Wenn Sie Ihren SIGSEGV
Handler mit dem sa_sigaction
Mitglied der sigaction
Struktur installieren weitergegeben sigaction()
, dann ist das si_addr
Mitglied der Struktur siginfo_t
an Ihren Handler übergab die Verwerfungen Adresse enthält.
Ich hatte Probleme, wo ein segfault, der durch das Schreiben auf einen nicht initialisierten Zeiger verursacht wurde, erschien und verschwand, je nachdem, ob ich -g oder was -o level hatte . Es hat damit zu tun, was Erinnerung wo ist. Genauso hatte ich das Hinzufügen oder Löschen eines Prints, bei dem der Fehler auftrat. Segfaults in C können schlaue Bastarde sein. –
Dies scheint http://tlug.up.ac.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV
static void signal_segv(int signum, siginfo_t* info, void*ptr) {
// info->si_addr is the illegal address
}
'info-> si_addr' ist die fehlerhafte Speicheradresse. Wie in dem von Ihnen angegebenen Link angegeben, kann die Adresse zu dem Zeitpunkt, an dem das Signal ausgelöst wurde, von "void * ptr" abgerufen werden. Siehe meine Antwort hier für Code, den ich mit ARM verwendet habe - http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes/1925461#1925461 – jschmier
ich valgrind
zu verwenden neigen dazu, zu arbeiten, die Lecks und Speicherzugriffsfehler anzeigt.
Valgrind ist für X86, AMD64 und PPC - der Frager läuft auf ARM. Ich bin jedoch angenehm überrascht zu lesen, dass der ARM-Support in Arbeit ist. – crazyscot
@crazyscot Ich habe tatsächlich den "Arm" Teil der Frage verpasst.Aber schön zu wissen Valgrind ist dabei, diese Architektur zu unterstützen;) – ereOn
Wenn Sie sich Sorgen über die Verwendung von -g auf der Binärdatei, die Sie auf dem Gerät laden, können Sie gdbserver auf dem ARM-Gerät mit einer stripped Version der ausführbaren Datei verwenden und Arm-GDB auf Ihrem Entwicklungscomputer mit ausführen die nicht abgestreifte Version der ausführbaren Datei. Die abgestreifte Version und die unstripped Version benötigen bis zu entsprechen, dies zu tun, so tun dies:
# You may add your own optimization flags
arm-gcc -g program.c -o program.debug
arm-strip --strip-debug program.debug -o program
# or
arm-strip --strip-unneeded program.debug -o program
Sie finden die GDB und gdbserver Dokumentation lesen müssen, um herauszufinden, wie sie zu verwenden. Es ist nicht so schwierig, aber es ist nicht so poliert wie es sein könnte. Hauptsächlich ist es sehr einfach, gdb versehentlich zu sagen, etwas zu tun, von dem man denkt, dass es lokal ausgeführt werden sollte, so dass es aus dem Remote-Debugging-Modus ausschaltet.
Sie können auch die Funktion backtrace() verwenden, falls verfügbar, die zum Zeitpunkt des Absturzes den Aufruf-Stack bereitstellt. Dies kann verwendet werden, um den Stapel abzulegen, wie es in einer höheren Programmiersprache geschieht, wenn ein C-Programm einen Segmentierungsfehler, einen Busfehler oder einen anderen Speicherverletzungsfehler erhält.
Backtrace() ist sowohl auf Linux und Mac OS X
verfügbar, wenn die Option -g der Fehler, wohl wissend, dann verschwinden läßt, wo es abstürzt ist unwahrscheinlich, nützlich sowieso sein. Es wird wahrscheinlich auf einen nicht initialisierten Zeiger in Funktion A geschrieben, und dann versucht Funktion B, diesen Speicher legitim zu verwenden und stirbt. Gedächtnisfehler sind ein Schmerz.
- 1. Woher weiß ich, welche Vorverarbeitung für das Modell verwendet wurde?
- 2. Woher weiß ich, wenn ein Bild in Picturebox geladen wird
- 3. Woher weiß ich, welche serielle Schnittstelle unter Linux verwendet wird?
- 4. Woher weiß ich, welche Version von Servlet-api.jar ich habe?
- 5. Woher weiß Haskell, welche Typklasseninstanz Sie meinen?
- 6. Woher weiß ich, wenn ein Lambda-Ausdruck null ist
- 7. Woher weiß Django, welche Migrationen durchgeführt wurden?
- 8. Woher weiß ich, ob mein Programm MDAC benötigt?
- 9. Php - Javascript - Woher weiß ich, welche Seiten in Farbe und welche in Schwarz-Weiß sind?
- 10. Woher weiß ich, welche Servlet- und JSP-Version ich verwende?
- 11. Woher weiß ich, welche Parameter nl80211 Befehle benötigen?
- 12. Woher weiß ich, ob ein Sound auf Android beendet ist?
- 13. Woher weiß ich, in welche Richtung der Benutzer geklaut hat?
- 14. Woher weiß ich, welche Pixeldichte-Version eines Bilds Android verwendet?
- 15. Woher weiß ich, ob ein System eingeschaltet ist?
- 16. Absturzbericht, wenn Benutzer auf das Adressbuch zugreift
- 17. Woher weiß ich, wann ich ein Objekt entsorgen muss?
- 18. RxJS Observable.concat: Woher weiß man, woher das nächste Ergebnis kommt?
- 19. Woher weiß man, ob ein NSWindow das Frontfenster ist?
- 20. Woher weiß ich, wenn der Bildschirm unter iOS gezeichnet wird?
- 21. Woher weiß Bundler, welche Umgebung zu verwenden ist?
- 22. Woher weiß string :: npos, auf welchen String ich mich beziehe?
- 23. Woher weiß ich, woher eine Nachricht in rabbitMQ gesendet wird?
- 24. Woher weiß ich, ob das richtige .NET Framework installiert ist?
- 25. Woher weiß ich, wenn WindowsFormsHost die Größe in WPF ändert?
- 26. Woher weiß NHibernate, in welche Klasseneigenschaften Werte eingefügt werden sollen?
- 27. Ich bekomme immer einen Segmentierungsfehler und ich weiß nicht warum
- 28. Woher weiß ich, dass removeEventListener erfolgreich war?
- 29. HTML - Woher weiß ich, wenn alle Bilder geladen sind?
- 30. AWS Kostenloses Konto, woher weiß ich, wann ich belastet werde?
Zumindest mit GCC können Sie -g hinzufügen, ohne die Optimierung zu deaktivieren. Und auf ELF-Zielen stellt GCC die Debug-Informationen in separate Abschnitte, so dass sie nicht einmal von der Festplatte geladen werden, bis sie benötigt werden. – janneb