Download mit curl



  • Hallo,

    ich wollte mit curl eine Seite downloaden, folgende Funktion nutze ich dafür:

    bool Parser::loadWebsite(char* url, char* filename, string* log_message){
    
        CURL* easyhandle = curl_easy_init ();
        curl_easy_setopt (easyhandle, CURLOPT_URL, url);
        FILE* file = fopen (filename, "w");
        curl_easy_setopt (easyhandle, CURLOPT_WRITEDATA, file);
        char* errbuff= NULL;
        int err_numb = curl_easy_setopt(easyhandle, CURLOPT_ERRORBUFFER, errbuff);
        if (err_numb != 0){
    	string strbuff = errbuff;
    	*log_message += strbuff;
        }
        curl_easy_perform (easyhandle);
        curl_easy_cleanup (easyhandle);
    
        return true;
    }
    

    Da ich verschiedene Seiten aufrufe, rufe ich die Funktion mehrmals auf. Das downloaden klappt an sich ganz gut, nur stürzt er manchmal gleich in der ersten Zeile ab und gibt die Fehlermeldung

    *** glibc detected *** [...] corrupted double-linked list: 0x082b6fb8 ***

    aus.

    Könnt ihr mir einen Rat geben?

    Ich danke euch.



  • Die Fehlermeldung deutet darauf hin, dass du irgendwo einen Fehler mit der Speicherverwaltung hast. Eventuell schreibst du irgendwo über Array-Grenzen hinweg oder versuchst Speicher frei zu geben, der schon freigegeben wurde.



  • Pass a char * to a buffer that the libcurl may store human readable error messages in. This may be more helpful than just the return code from curl_easy_perform. The buffer must be at least CURL_ERROR_SIZE big.

    Du lieferst für CURLOPT_ERRORBUFFER keinen Speicherbereich sondern ein Nullpointer.



  • Ich danke euch für eure Antworten. Das Problem mit dem Nullpointer ist ausgebügelt, entweder es lag nicht daran, oder ich habe dadurch eine neue Fehlermeldung bekommen (allerdings deutet das auch wieder auf ein Speicherproblem hin):

    *** glibc detected *** [...]: malloc(): memory corruption: 0x081c1780 ***

    Durch Debuggen habe ich wieder gesehen, dass der Fehler gleich am Anfang der Funktion auftritt, alldings erst, wenn ich die Funktion mehrmals (mind. 1 mal) aufgerufen habe. Kann es sein, dass ich irgendein Speicher vergessen habe freizugeben?

    Ich danke euch.



  • Ulf schrieb:

    Das Problem mit dem Nullpointer ist ausgebügelt

    Wie?

    Kann es sein, dass ich irgendein Speicher vergessen habe freizugeben?

    Klar kann das sein (woher sollen wir das aber wissen?), aber es würde nicht zu dem Fehler führen.
    Warum benutzt du den Puffer, wenn du hinterher überhaupt nicht prüfst, ob ein Fehler aufgetreten ist, geschweige denn den Meldungstext auch ausliest?



  • manni66 schrieb:

    Ulf schrieb:

    Das Problem mit dem Nullpointer ist ausgebügelt

    Wie?

    mit

    char errbuff [CURL_ERROR_SIZE];
    

    manni66 schrieb:

    Warum benutzt du den Puffer, wenn du hinterher überhaupt nicht prüfst, ob ein Fehler aufgetreten ist, geschweige denn den Meldungstext auch ausliest?

    mit

    if (err_numb != 0){
        string strbuff = errbuff;
        *log_message += strbuff;
    }
    

    prüfe ich, ob Fehler aufgetreten sind. Falls ja, wird die Fehlermeldung log_message angehangen (und an anderer Stelle ausgegeben). Fehlermeldungen von curl bekomme ich aber nicht.



  • Was übergibst du denn als Wert für log_message? (btw, es ist auf jeden Fall ungewöhnlich einen std::string per Zeiger zu übergeben - besonders wenn du nicht prüfst, ob der Wert gültig ist)



  • log_message ist ein String, dessen Adresse allen Funktionen mitgegeben wird. Falls irgendwelche Fehlermeldungen auftreten, wird dann eine entsprechende Meldung angefügt, die dann so später ausgegeben werden kann.

    edit: daran sollte es eigentlich nicht liegen, wenn ich den entsprechenden Teil auskommentiere, bleibt der Fehler trotzdem vorhanden.



  • Ulf schrieb:

    mit

    if (err_numb != 0){
        string strbuff = errbuff;
        *log_message += strbuff;
    }
    

    prüfe ich, ob Fehler aufgetreten sind. Falls ja, wird die Fehlermeldung log_message angehangen (und an anderer Stelle ausgegeben). Fehlermeldungen von curl bekomme ich aber nicht.

    Du prüfst, ob beim Binden des Meldungspuffers ein Fehler aufgetreten ist. Sollte das der Fall sein, steht in dem Puffer aber sicher keine sinnvolle Meldung! Alle folgenden curl Funktionen ( insbesondere perform, die die eigentliche Arbeit macht) sind ungeprüft und Meldungen werden nicht ausgegeben.


Anmelden zum Antworten