Was soll ich denn jetzt tun?
-
Ich arbeite gerade an einem komplexeren Parser und bin auf einen Fehler gestoßen, bei dem das Programm sich "still" verabschiedet.
Aber das wäre ja kein Problem, wenn das Programm nicht vollkommen normal verlaufen würde, wenn der Debugger dran hängt. Welcher Fehler macht denn sowas?
Versteckt sich vor dem Debugger!
Wie soll ich das denn jetzt finden?EDIT: GCC 4.8.0 + gdb 7.5
EDIT: Ich glaube das liegt am zusätzlichen delay. Sobald ich eine Pause einbaue läufts normal weiter. Aber ich benutze nichtmal threads oder so.
-
Hmm schwierig. Ich schätze mal, du hast irgendwo UB. Eventuell greifst du auf Speicher zu, der dir nicht gehört. Ist das viel Quellcode?
-
Vielleicht auch nicht-initialisierte Variablen?
-
Tim06TR schrieb:
bei dem das Programm sich "still" verabschiedet.
Beschreib das mal genauer.
Aber das wäre ja kein Problem, wenn das Programm nicht vollkommen normal verlaufen würde, wenn der Debugger dran hängt. Welcher Fehler macht denn sowas?
Könnte allgemein undefiniertes Verhalten sein. Ist aber ungewöhnlich, dass es im Debugger nicht nachvollziehbar ist.
Ist das Programm parallelisiert? Dann wäre meine Wette auf eine Race Condition. Da hast du dann nämlich unterschiedliches Zeitverhalten mit Debugger und ohne, was die Beobachtung perfekt erklärt.
Versteckt sich vor dem Debugger!
Wie soll ich das denn jetzt finden?Kommt drauf an, was genau '"still" verabschiedet' bedeutet. Allgemeine Ideen: valgrind, core dump, mit dem Debugger an den laufenden Prozess anhängen.
-
Schonmal valgrind probiert?
Du verwendest wahrscheinlich viele rohe Pointer, da passieren leicht Fehler und UB. Mit Valgrind machst du recht schnell den Fehler ausfindig.
-
Ja ist schon ein wenig was.
Ich hantiere extrem viel mit Iteratoren herum, denn ich benutze einen Cursor der durch das Programm hüpft, das geben ich auch an Lambdas und andere Funktionen weiter.
Ich schau mal ob ich es reduzieren kann. Normalerweise brauche ich nie mehr als 50 Zeilen posten, aber da wird schwierig.
Schreib gleich nochmal...
-
Tim06TR schrieb:
Ich hantiere extrem viel mit Iteratoren herum
Dann:
-D_GLIBCXX_DEBUG
-
pointee schrieb:
Tim06TR schrieb:
Ich hantiere extrem viel mit Iteratoren herum
Dann:
-D_GLIBCXX_DEBUGAh vielen Dank für den Tipp. Jetzt bekomme ich zumindest einen vernünftigen Hinweis.
Kopie aus Console:
Enter number: 6
77
d:\mingw\include\c++\4.8.0\bits\basic_string.h:828: std::basic_string<_CharT, _T
raits, _Alloc>::const_reference std::basic_string<_CharT, _Traits, _Alloc>::oper
ator[](std::basic_string<_CharT, _Traits, _Alloc>::size_type) const [with _CharT
= char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::b
asic_string<_CharT, _Traits, _Alloc>::const_reference = const char&; std::basic_
string<_CharT, _Traits, _Alloc>::size_type = unsigned int]: Assertion '__pos <=
size()' failed.This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.Process returned 3 (0x3) execution time : 1.047 s
Press any key to continue.ahmm...
-
std::string blub;
blub[12] = 'x';
-
Tim06TR schrieb:
ahmm...
Jetzt kannst du mit gdb anrücken, der fängt die Assertion ab und du kannst einen schönen Backtrace erstellen.
-
Ich habe den Fehler jetzt auf eine Funktion festgenagelt.
EDIT: Ich schreib sie neu. Dann optimier ich die gleich...
-
Tim06TR schrieb:
Ich habe den Fehler jetzt auf eine Funktion festgenagelt.
EDIT: Ich schreib sie neu. Dann optimier ich die gleich...
Was is der Fehler nu?
-
Habe mich vertan. Das war es doch nicht.
Ich lande komischerweise nun bei meinem Matheparser.Es kann doch auch nicht normal sein, dass wenn ich nen string auf die Watchlist setze, dass der mich plötzlich in "std::string::size()" wirft?
EDIT: + Der Debugger und das Programm verabschieden sich ohne ein mucks zu machen sobald wenn ich über die Stelle springen will.
[Inferior 1 (process 4380) exited with code 03]
Debugger finished with status 0
-
Tim06TR schrieb:
Habe mich vertan. Das war es doch nicht.
Ich lande komischerweise nun bei meinem Matheparser.Es kann doch auch nicht normal sein, dass wenn ich nen string auf die Watchlist setze, dass der mich plötzlich in "std::string::size()" wirft?
Ist das ein Frage oder eine Feststellung? und für wen?
-
Hast du Lust den Quellcode hochzuladen, würde mich gerade mal interessieren.
-
Sekunde dann kopiere ich das kurz richtig zusammen.
-
1. Ich habe mir nicht übermäßig viel Zeit genommen das Programm sauber zu strukturieren, außer in manchen einzelnen Sourcedateien, die ziemlich sauber sind.
Im ScriptInterpreter code ist auch ein bisschen was an code redundanz in den Funktionen.Die Scriptdatei habe ich in den Ordner gelegt. Zum Testen hatte ich den festen Pfad in der Main angegeben.
http://81.169.156.131:81/TEMPORARY/Code.zip
Ich habs mit Codeblocks geschrieben.Falls ich was vergessen haben sollte, dann ergänze ich es sofort.
EDIT: Den Matheparser habe ich eigentlich auch von oben bis unten auf Herz und Nieren getestet. Der läuft, wenn allein gestartet auch ganz problemlos.
-
Minimalbeispiel! Portabel!
So guckt sich das doch niemand an.
-
Ich habe doch keine Ahnung, wo ich suchen muss.
Normalerweise kann ich alle Probleme sofort lösen. Aber ich kann nicht sonderlich gut debuggen, wenn er nicht an die Problemstelle springt, sondern bye bye sagt.EDIT: Und out hatte danach gefragt also hab ich es kurz geuppt.
Ich such weiter.
-
Hui 386 Fehler bekomm ich grad, mal schauen:D