PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SegFault in operator new()



7.e.Q
16-02-2005, 06:53
Was ist gemeinhin der Grund, daß ein Programm mit folgendem Segmentation Fault abstürzt?



#0 0x401a6bdf in _int_malloc () from /lib/libc.so.6
#1 0x401a5c7d in malloc () from /lib/libc.so.6
#2 0x400e3d7a in operator new () from /usr/lib/libstdc++.so.5



Man *fluch* wieso passiert das? Das funktionierte bisher wunderbar, bis ich angefangen habe, in meinem Programm an völlig anderen, völlig davon unabhängigen Stellen mit der STL zu arbeiten. Ich benutze an anderer Stelle drei STL Queues. Und seit ich die benutze, stürzt das Programm mit obiger Fehlermeldung an einer völlig anderen Stelle ab, die überhaupt nichts mit den Queues zu tun hat. Schmiert der da wild im Speicher rum oder wie? Wie kann ich das denn verhindern???

Hilfe! Ich dreh hier am Rad! Kann mir da bitte einer helfen?

Joghurt
16-02-2005, 11:27
Hilfe! Ich dreh hier am Rad! Kann mir da bitte einer helfen?Ja, du hast einen Fehler in Zeile 462. :p

Meine Glaskugel ist in Reparatur, könntest du vielleicht irgendwo den Code posten (z.B. bei http://rafb.net/paste/)

7.e.Q
17-02-2005, 06:05
Sarkasmus... Hab ich wohl verdient, hä... Egal. :rolleyes:

Da der Kot:



cCG[ActualCG] = new CCGProcess(); // <------- Hier drinne crasht's schon.

cCG[ActualCG]->SetCGMFD(open(ptsname(iCGM_MasterPTY[ActualCG]),O_WRONLY | O_NOCTTY));
cCG[ActualCG]->SetCGEFD(open(ptsname(iCGE_MasterPTY[ActualCG]),O_WRONLY | O_NOCTTY));
cCG[ActualCG]->SetIPCFD(open(ptsname(iIPC_MasterPTY[ActualCG]),O_WRONLY | O_NOCTTY));


Ach ja, und es ist NICHT der Konstruktor von CCGProcess. Da werden nur ints drin mit Werten vorbelegt und ein paar character-Arrays auf Null gesetzt. Das funktioniert auch, wenn ich die Nutzung von STL an völlig anderen Stellen vermeide.

Kann's sein, daß STL da irgendwie wild im Speicher rummalt?

locus vivendi
17-02-2005, 13:48
Kann's sein, daß STL da irgendwie wild im Speicher rummalt?
Das kann schon sein, ich halte das aber für unwahrscheinlich. Wenn malloc selber fehlerhaft auf den Speicher zugreift deutet das eigentlich darauf hin, das interne Daten von malloc beschädigt wurden. Mir fallen folgende Möglichkeiten ein, wie du den Fehler finden könntest, wenn du ggf. Zugriff auf die entsprechenden Tools hast:

1. Du analysierst selber noch einmal den Code.
2. Du postest den Code, ggf. auf das Wesentliche gekürzt und hoffst das jemand anderes Fehler findet.
3. Du benutzt herkömmliche Debugger wie GDB, um dir z.B. einen umfassenderen Backtrace anzeigen zu lassen.
4. Du benutzt valgrind, das hat sich für solche Fehler eigentlich bewährt.
5. Du benutzt einen neuen GCC, mit "mudflap", der kann dir vielleicht auch sagen wo der Fehler ursprünglich ist.
6. Vielleicht kannst du auch Tools benutzen die den Code statisch untersuchen, wie, nur als Beispiel, Flawfinder.

Achja, falls du das nicht bisher schon tust: Den Compiler so laufen lassen, das er möglichst viele Warnungen ausspuckt.

Vielleicht hilft das ja.

RapidMax
18-02-2005, 22:14
Verwendet das Programm Threads? (new CCGProcess())

Die STL ist nicht überall Thread-save. z.B. sind die Strings nicht threadsave, da sie copy-on-write verwenden. Wenn Threads verwendet werden, musst darauf verzichtet werden (Alternative: z.B. Bochs).

Gruss, Andy