Speicherschutzverletzung



  • Hallo,

    ich hoffe ich poste das hier an die richtige Stelle.

    Ich habe ein Programm aus dem Internet gegeben, welches in C++ geschrieben ist. Bei dem Versuch dieses auszuführen bekomme ich in meiner Shell den hinweis "Speicherschutzverletzung".

    Ich bin neu im C++-Bereich, ebenfalls unter den Linux-Nutzern, also habe ich mit Google erstmal herausgefunden, dass dies Bedeutet, dass ich in mienem Programm einen Zeiger falsch gesetzt habe.

    Wie finde ich nun mehr über diesen Fehler heraus? Ich habe insgesamt 49 Dateien und noch einige Bibliotheken, die in dem Programm mit einspielen, da wird es schwer sich manuell auf die Suche nach dem Fehler zu machen, oder?

    Viele Grüße und vorab vielen Dank,
    smaica



  • smaica schrieb:

    Wie finde ich nun mehr über diesen Fehler heraus? Ich habe insgesamt 49 Dateien und noch einige Bibliotheken, die in dem Programm mit einspielen, da wird es schwer sich manuell auf die Suche nach dem Fehler zu machen, oder?

    Tja, da sagste was. Das ist auch für erfahrene Programmierer manchmal nicht ganz einfach. Es gibt Tools wie Debugger (für Linux z.B. gdb glaub ich), mit denen du das Programm schrittweise durchgehen kannst und dir Live alle Variablen anschauen kannst. So findet man viele Fehler.

    Aber mal ne andere Frage: Wenn du nicht mit Linux und auch nicht mit C++ gemacht hast bisher, woher kommt dann ein Projekt mit 49 Quell-Dateien und Bibliotheken??



  • Aber mal ne andere Frage: Wenn du nicht mit Linux und auch nicht mit C++ gemacht hast bisher, woher kommt dann ein Projekt mit 49 Quell-Dateien und Bibliotheken??

    Enthusiastisch habe ich eine Promotionsstelle angenommen und geglaubt das "Handwerkszeug" sei dabei nicht so das Problem - aber das ist doch weitaus schwieriger als gedacht (:

    Okay, ich habe mir nun ecplise besorgt und die Dateien samt Bibliotheken dort eingelesen. Ich bekomme einen Haufen Fehlermeldungen und versuche das ganze nun mit Haltepunkten durchzulaufen (Doppelklick in den grauen Bereich neben dem Quelltext).
    Dann klicke ich auf Debug as C++ und bekomme die Fehlermeldung:

    "Launch failed. Binary not found".
    

    Nach einigem Googlen habe ich gelesen, dass das an falscher Einstellung für den Binary Parser liegt, ich habe also unter Project Properties - C/C++ Build - Settings - Binary Parsers folgende angeklickt: PE Windows Parser, Elf Parser und GNU Elf Parser. Aber das klappt alles nicht ):

    Woran kann das liegen?

    Viele Grüße
    smaica



  • Debuggen kannst du erst, wenn das Programm erfolgreich erstellt wurde.

    Solange das Programm wegen Fehlern beim Kompilieren oder Linken gar nicht erst erstellt wird, wird das nichts. Du musst also zuerst die Fehler beheben.



  • Und unter Eclipse ist mit "einfach mal reinkopiert" gar nichts getan, weder in Java noch in C++. Das ganze Programm muss erstmal richtig kompiliert werden, was vorher durch eine ordentlich hinreichende Konfiguration auch erstmal sichergestellt werden muss.

    Als ich angefangen habe zu programmieren (das war etwas Java in der Schule) habe ich Eclipse genutzt (bot sich ja an). Als ich dann C++ machen wollte (mit Eclipse) bin ich erstmal vom Stuhl gefallen, als ich gesehen hab wie schwer das vergleichsbar war (wohlgemerkt: nur das einrichten/konfigurieren). Visual Studio bringt da doch weit mehr Komfort mit.

    Mittlerweile (nun da ich das ja auch beruflich mache) geht das alles halbwegs gut von der Hand mit Eclipse und C++.

    Aber auch da kann ich dir sagen, "mal eben so" ein Projekt importieren ist nicht. Und wenn man dann auch noch keine Ahnung vom "Werkzeug" (in dem Fall die Sprache) hat, dann wirds nochmal weit schwerer.

    Aber wie mein Vorredner schon sagte. Du hast erstmal sprachliche Fehler im programm, die gelöst werden wollen, bevor es kompiliert. Danach darfst du wegen der Bibliotheken noch alle möglichen Linkerfehler beseitigen. Und danach, wenn es denn läuft, darfst du semantische Fehler im Programmablauf ausmerzen.



  • smaica schrieb:

    Enthusiastisch habe ich eine Promotionsstelle angenommen und geglaubt das "Handwerkszeug" sei dabei nicht so das Problem - aber das ist doch weitaus schwieriger als gedacht (:

    Darf ich fragen in welchem Bereich du promovierst, wo das Programmieren als nötiges Handwerkszeug derart verschleiert rüberkommt. 😉

    Gruß,
    -- Klaus.



  • Eine Debug-Version kompilieren und dann im Debugger (gdb) ausführen. Der zeigt dir dann auch, wo es geknallt hat und du kannst dir z.B. noch den Aufruf-Stack angucken. Der GDB ist ein Konsolenprogramm. Es gibt aber auch GUIs dafür und/oder die eine oder andere IDE mit 'ner Schnittstelle dafür. Mit Eclipse habe ich lange nicht mehr gearbeitet (und schon gar nicht für C bzw C++). Aber Code::Blocks hat zum Beispiel ne GDB-Schnittstelle. Ich bin aber unter Linux (zu Hause privat) eher ohne IDE unterwegs, also Text-Editor + Make + GDB in der Konsole. Nicht perfekt. Aber es geht. Den Debugger muss ich eh extrem selten anschmeißen.

    Viel Erfolg!



  • Eine Debug-Version kompilieren und dann im Debugger (gdb) ausführen. Der zeigt dir dann auch, wo es geknallt hat und du kannst dir z.B. noch den Aufruf-Stack angucken.

    Toll! Herzlichen Dank! Ich habe nun zumindest schon einmal eine (für mich leider noch undurchsichtige) Fehlermeldung bekommen, aber damit lässt sich arbeiten:

    Program received signal SIGSEGV, Segmentation fault.
    0x400bcc00 in QLocalePrivate::numberToCLocale(QString const&, QLocalePrivate::GroupSeparatorMode, QVarLengthArray<char, 256>*) const ()
    from /usr/lib/libQtCore.so.4

    Vielen Dank schonmal, ich versuche mich so mal durchzukämpfen!

    LG
    smaica



  • Wenn er dir das raushaut danbn tipp bt ein und schau ab wo dein Code anfängt.


Anmelden zum Antworten