C++/Segfault

Post Reply
Message
Author
Verzweifler

C++/Segfault

#1 Post by Verzweifler »

Hallo,

Ich habe hier ein C++ Programm, dass nach ausführen mit "Segmentation Fault" abbricht. Wenn ich mir per Debugger anschauen will, an welcher stelle es passiert, finde ich ihn irgendwo in den C++ Standardfunktionen, nicht aber in meinem Code !!

Leider habe ich keine Ahnung, wie ich vorgehen soll um den Fehler zu beheben...Kann mir da jemand helfen ?
Am Besten wäre es, wenn man C++ in einem Modus so wie Java laufen lassen könnte, sodass jede illegale Speicheranweisung abgefangen würde, z.B.
main()
{
int array[5];
array[5] = 1313;
}
Sowas geht of einfach, und der Fehler ist nicht auffindbar...

Bitte helft mir, bin schon am verzweifeln (Alles neuschreiben ?!?!?)

??

Re: C++/Segfault

#2 Post by ?? »

Du arbeitest noch mit Arrays? In welchem Jahrtausend leben wir denn?

Verzweifler

Re: C++/Segfault

#3 Post by Verzweifler »

Vielen Dank für die Hilfreiche Nachricht

tj

Re: C++/Segfault

#4 Post by tj »

Hi,

in C sind gueltige Indices fuer
int array[5];
nur 0,1,2,3,4 und NICHT 5. Daher der SegFault.

Gruesse, tj

axeljaeger

Re: C++/Segfault

#5 Post by axeljaeger »

> Du arbeitest noch mit Arrays? In welchem Jahrtausend leben wir denn?
Mach mal einen besseren Vorschlag, ich finde Arrays auch nicht Ideal, weis aber nicht, wie man es besser machen kann

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: C++/Segfault

#6 Post by bakunin »

Hi!

> ich finde Arrays auch nicht Ideal, weis aber nicht, wie man es besser machen kann

Nun, ursprünglich war C++ ja ein C, das mit allen Schlüsselwörtern vollgestopft wurde, die irgendwo auffindbar waren, bei dem aber dafür vergessen wurde, eine Klassenbibliothek hinzuzufügen. Um die Sprache nachträglich noch halbwegs erträglich zu machen, wurde dann irgendwann noch die STL draufgepfropft. Die STL ist gut in Bjarne Stroustrups "Die C++ Programmiersprache", das jeder ernsthafte C++-Entwickler im Regal stehen (oder alternativ vor sich liegen) haben sollte, beschrieben. Wer für die miserable Übersetzung dieses etwas chaotisch organisierten (aber dennoch sehr lehrreichen) Buches kein Geld ausgeben will, der findet STL-Dokumentation auch <!--http--><a href="http://www.sgi.com/tech/stl/" target="_blank">hier</a><!--url-->. Ich denke, dass man inzwischen voraussetzen kann, dass ein vernünftiges, halbwegs aktuelles System auch über die STL verfügt, d.h. man kann sie bedenkenlos einsetzen. Es macht einem das Leben mit C++ wirklich um ein Vielfaches leichter. Und insbesondere muss man keine Arrays mehr verwenden.

Viele Grüße,
Wolf "nicht gut auf C++ zu sprechen" gang

PS: Alle destruktiven Äußerungen in obigem Text kann ich auf Wunsch gerne näher erläutern. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

PPS: C-Programmierern, jene die Mächtigkeiten der STL mögen, sich aber C++ nicht antun möchten, sei an dieser Stelle die unter der GNU Lesser-GPL stehende <!--http--><a href="http://www.annexia.org/freeware/c2lib/" target="_blank">c2lib</a><!--url--> empfohlen.

PPPS: Zum eigentlichen Problem: Der Verzweifler hat eben buggy Code geschrieben. Ist ja nichts Ungewöhnliches, es ist <!--http--><a href="http://www.enbug.org/" target="_blank">im Gegenteil ja sogar notwendig</a><!--url-->. So einen Fehler muss man halt korrigieren. Wenn eine Bibliotheksfunktion crasht, ist entweder die Bibliothek buggy (unwahrscheinlich) oder man hat ihr fehlerhafte Parameter übergeben (viel wahrscheinlicher).

Descartes

Re: C++/Segfault

#7 Post by Descartes »

Wenn du C++ nehmen möchtest warum dann statt int* nicht vector<T> verwenden ?

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#include <iostream>
#include <vector>

using namespace std;

int main(int argc, char** argv)
{
// vector<T> mit 5 int-Elementen, alle Elemente mit 0 initialisieren
// alternativ:
// vector<int> vec(5);
vector<int> vec(5, 0);
vec[<!--no-->1<!--no-->] = 5;

for(unsigned int i=0; i<vec.size(); i++)
cout << i << ". Element = " << vec[<!--no-->i<!--no-->] << endl;

// hier crasht nix, wird halt vom vector<T> abgefangen
vec[<!--no-->5<!--no-->] = 5;

return 0;
}
</font><hr></pre></blockquote>

Verzweifler

Re: C++/Segfault

#8 Post by Verzweifler »

Danke für die Antworten....

Aber ich verstehe es immer noch nicht ganz, wie man so einen Segfault flott finden soll. Ich habe jetzt ~3h in den Code geschaut, biss ich die anweisung (in.substr(i, 1) entdeckte, wobei eigentlich in.substr(0, 1) stehen müsste.... Warum ist er nicht einfach bei der Anweisung rausgeflogen, und hat gesagt (so wie Java das kann)
String out of bounds exception in molecule.cpp line 232

Das hätte mir sofort geholfen..... Aber nein, einfach irgend ein segfault wird geschmissen. Auch die Sache mit meinem Debuger ist mir schleierhaft (ddd, frontend zu gdb): Der fliegt auch nicht in der Zeile raus sondern erst später !

Ich verstehe es, dass es Performance kosten würde, immer zu überprüfen, ob die Argumente auch alle gültig sind (so wie: string string::substring(int start, int length) { if(start + length > this.legth()) ....} ),
ABER: Für die Debug Phase ist es doch gut, wenn man derartige Sachen geprüft kriegt...
Es wäre also doch gut, wenn man ein Programm in der Debug Phase auf einer Virtuellen Maschine startet, die bei sofort stoppt, wenn von der falschen Anweisung auf den falschen Speicher zugegrifen wird (nicht, wie in C++, wo man oft keinen segfault kriegt, wenn man über grenzen geht, weil dieser Speicher noch irgendwie zu anderen Code/Variablen gehört....)

Frage:
Gibt es so etwas ?
Ist sowas in arbeit ? (Warum nicht ?)

Verzweifler

Post Reply