error: core file bei memcpy

zoidberger

Mitglied
Hallo mal wieder!

Heute habe ich eine etwas komplexere oder vlt. tiefgreifendere Frage für euch.
Möglicherweise könnte man sie abkürzen mit "was hat die Zahl 16384 mit memcpy" zu tun..

naja, ich versuchs mal mit einer theoretischen erklärung:
Ich habe hier mehrere applikationen auf einem server auf dem linux läuft.
Die Prozesse nutzen den Server ganz gut aus, dies schwankt allerdings ziemlich.
Die Prozesse sind so genannte TCP relays, die daten entgegennehmen und an Prozesse auf anderen Servern weiterleiten oder umgekehrt.
Die TCP relays haben einen ringbuffer, der automatisch vergrößert wird, wenn er zu einem gewissen Prozentsatz gefüllt ist.
Dies funktioniert bei vielen der relays ohne Probleme.
Nur bei einem bzw. zwei kommt es ab und zu zu einem crash.
Wenn ich mir das corefile anschaue sehe ich die Zeile in der es passiert ist und wie groß die var 'r_buff' zu diesem Zeitpunkt ist.
Code:
        if (size >= free_size())
        {
            LOG("\tNot enough free_space=%d. Trying to increase. \n",
                   free_size());
            if (increase_in_pct(reallocate_in_pct) == -1) {
                LOG("\tIncrease failed \n")
                return -1;
            }
        }

        // Copy as much as we can until the end of the buffer.
        // leave the rest for the recursion below where the wp is moved to 0
        if ((write_pointer + size) > buff_size) {
            w_size = buff_size - write_pointer;
        }

        void* r = memcpy(buff+write_pointer, r_buff, w_size);

        if (r == NULL) {
            LOG("\tOops. memcpy error.");
            return -1;
        }

in der Zeile 'void* r = memcpy(buff+write_pointer, r_buff, w_size);'
passiert der Fehler.. und laut core file ist r_buff = 16384 groß.

Wenn der Arbeitsspeicher des Servers ausgelastet wäre, sollte eigentlich der swap übernehmen.. wenn es einen fehler bei memcpy gäbe, sollte es eigentlich durch die if klausel abgefangen werden.. aber soweit kommt es im fehlerfall nie.

Hat denn jemand eine Idee was da das Problem sein könnte?
Reproduzierbar ist dieser Fehler jedenfalls nicht..


Beste Grüße

Zoid
 
Hi.

Was ist die Größe von buff? Was ist der Wert von write_pointer? Was ist der Wert von w_size?

Die Speicherbereiche überlappen sich doch nicht etwa, oder?

memcpy gibt nie NULL zurück, du kannst dir die Fehlerprüfung also sparen.

Gruß
 
Hi deepthroat!

Schön, dass wir uns hier wieder treffen ;)
Also das Problem ist mittlerweile gelöst.
Ich hab zunächst mal in die Richtung deines Tips gesucht.. bin dann aber über ein anderes Problem gestolpert.

Ich habe den Ringbuffer als eigene Klasse geschrieben.. und fülle einen stl vector mit objekten dieser Klasse....
In der Klasse selbst habe ich einen char* buff, der auf den "buffer" zeigt.
Beim automatischen reallokieren bzw. beim vergrößern des vektors werden objekte koppiert.. und somit auch die char*... 1 zu 1.

Ich habe jetzt den vektor nichtmehr mit konkreten objekten gefüllt sondern mit pointern auf objekte. Das ist etwas komplizierter mit der initialisierung und dem vernichten der eigentlichen Objekte, aber ich hatte keine lust den copy constructor umzuschreiben.

Vielleicht hilft das jemandem, der das selbe Problem hat?!

Nichtsdestotrotz, vielen Dank Deepthroat!

Bis bald ;)
 
Zurück