C++ vector::_M_range_check, aber nur wenn als Release compiled

E

edeltoaster

Gast
ich bastele gerade ein programm zur auswertung von expressionsdaten um die signifikanz bestimmter mutationen für das vorkommen von bestimmten krebsarten zu bestimmen.

nun habe ich das problem,daß das programm zwar funktioniert wie es soll im Debug-mode aber sobald ich als release compile wirft er mir einen vector out of range um die ohren (und es wird def nur in range darauf zugegriffen)
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check
Abort trap

woran liegt sowas?bin nicht sonderlich c++ erfahren.lässt sich gdb überhaupt mit der release-version nutzen?nö oder?
optimierungsflags runtersetzen brachte nichts.
 
sobald ich als release compile wirft er mir einen vector out of range um die ohren
Das heißt er bricht während der Laufzeit ab? Kannst du da vielleicht etwas genauer lokalisieren?

Hast du schon einmal versucht, das ganze zu kompilieren und dabei -Wall zu setzen, um mehr Informationen zu bekommen?
Da ich annehme, dass du den Code nicht posten willst (was das ganze natürlich nicht gerade leichter macht), könntest du mal schrittweise durch das Programm gehen und dir die Werte dabei ansehen.

Was noch gehen könnte, wäre, wenn du einfach mal versuchst, den Fehler abzufangen, also in der Art:
try
{
...
} catch (std::out_of_range &some_error)
{ ..
}
Könnte eventuell beim lokalisieren helfen.

Der Fehler tritt vermutlich auf, wenn du auch deinen Vektor .at(i) anwendest, oder?
Interessant wäre vielleicht noch deine Compiler-Version und das OS.

Direkt weiß ich nicht, warum es beim Release ausgerechnet nicht geht, aber vielleicht kommen wir mit ein paar mehr Angaben weiter.


Gruß,

badday
 
hat sich erledigt,hatte damit garnix zu tun, war doof gemerged :)
danke und frohe weihnacht lieber helfer! ;)
 
edeltoaster schrieb:
lässt sich gdb überhaupt mit der release-version nutzen?nö oder?
optimierungsflags runtersetzen brachte nichts.

Auch wenn sich die Frage geklärt hat: Du kannst auch GDB mit einem optimierten Executable benutzen.

Mit -O oder -O2 kompilieren und dann mit -g bzw. -g3 Debuginfos generieren. Anschließend im GDB ein catch throw machen oder ein break __cxa_throw und dann run. Die Stacktraces sind zwar nicht mehr so richtig brauchbar, je nachdem wie aggressiv optimiert wurde (deshalb am besten auch nicht mit -O3 übersetzen dafür), aber immerhin dann ein guter Hinweis.
 
Zurück
Oben