Crash MongoDb c driver
-
TangoQueen schrieb:
Tatsaechlich traue ich dem Compiler nicht, weswegen ich mir per Default angewoehnt habe sowas zu machen.
Trau ihm ruhig und lass unnötigen Code weg. Es macht den Code klarer und damit weniger fehleranfällig.
-
TangoQueen schrieb:
Tatsaechlich traue ich dem Compiler nicht, weswegen ich mir per Default angewoehnt habe sowas zu machen.
So ein Bullshit. Das ist einfach nur falsch und hässlich.
SeppJ schrieb:
Was soll das?
Das erinnert mich an Code von einem Praktikanten, den ich noch ab und zu bei uns im Source finde. In etwa sowas:
Type * var; var = NULL; var = new Type(); if (var != NULL) { }Und das hat er mit Zeigern immer so gemacht.
-
Mechanics schrieb:
TangoQueen schrieb:
Tatsaechlich traue ich dem Compiler nicht, weswegen ich mir per Default angewoehnt habe sowas zu machen.
So ein Bullshit. Das ist einfach nur falsch und hässlich.
SeppJ schrieb:
Was soll das?
Das erinnert mich an Code von einem Praktikanten, den ich noch ab und zu bei uns im Source finde. In etwa sowas:
Type * var; var = NULL; var = new Type(); if (var != NULL) { }Und das hat er mit Zeigern immer so gemacht.
@Mechanics: Ich kenne einen Kerl aus meinem Studium, der alle kritisierte und dann selbst durchgefallen ist. So ein Typ mit Nerd-Shirt und -Brille, der aber irgendwie nie zuhoerte und nie richtig lesen konnte.
Ich glaube ich muss mich hier nicht beleidigen lassen. Vor allem nicht von jemanden, der anstatt das Problem zu loesen sich lieber an Kleinigkeiten auslaesst!
Der "Schwachsinnscode" ist so genau richtig und ihr konzentriert euch nicht auf das Hauptproblem. Er kommt nicht in den Schleifencode rein und das liegt an
mongoc_cursor_next(cursor, &bson). Der C-Code ist vom offiziellen mongoDb c driver, meine Frage richtet sich also an Coder mit Erfahrung mit diesem Treiber.
Erspart mir also bitte eure Kommentare, wenn ihr selbst keine Ahnung habt!!!
@SeppJ: Danke, das ist tatsaechlich ein Problem, das waere mir aber selbst aufgefallen. Wie gesagt, er crashed schon vorher.
-
Ich kenne Mongo db nicht... aber vom ersten Eindruck her...
std::vector<JsonValue*> payloadList = std::vector<JsonValue*>(); payloadList.clear(); MongoCursor* cursor = DbWrapper::getMongoCursor(DbWrapper::client, DBNAME, COLLECTIONNAME, QUERY, LIMIT, SKIP); // der Aufruf macht den Eindruck, als ob Cursor eine Resource ist, wäre also zu vermuten, dass er irgendwo wieder freigegeben/zerstört werden muss if(!cursor) { Utils::printToConsole("Could not create cursor!"); return payloadList; } const Bson* bson = DbWrapper::createBsonPtr(); // hm... while(!mongoc_cursor_error(cursor, &DbWrapper::error) && mongoc_cursor_more(cursor) && mongoc_cursor_next(cursor, &bson)) // moment mal... cursor_next liest doch aus der Datenbank? // aber der Rückgabewert ist es nicht, also ist vermutlich bson ein Ausgabeparameter? // wieso wurde er dann vorher mit etwas (nicht-leerem) initialisiert? { JsonValue* jsonValue = NULL; // wurde schon angesprochen (*jsonValue) = DbWrapper::convertBsonToJsonValue(bson); payloadList.push_back(jsonValue); } DbWrapper::destroyBson((Bson*)bson); // das würde dann auch nicht so recht passen, wenn bson hier freigegeben werden muss, müsste das nicht in der Schleife auch ständig passieren ? oder eben gar nicht? // könnte natürlich sein, dass die API wirklich so seltsam ist... return payloadList;mal sehen... sieht so aus als ob die API nicht seltsam ist.
Has du das verlinkte Dokument auch selbst mal durchgelesen und das Beispiel nachvollzogen?
Hab ich jetzt das gesuchte Problem gefunden? wahrscheinlich nicht.
TangoQueen schrieb:
Der "Schwachsinnscode" ist so genau richtig
Erfahrungsgemäß eine gewagte Behauptung. Wenn der Fehler nicht gleich offensichtlich ist - andernfalls wäre der Thread ja gar nicht erst enstanden - ist es doch nicht unwahrscheinlich, dass er sich an einer unerwarteten Stelle befindet, oder?
Du solltest auch in Erwägung ziehen, dass sich deine Interessen nicht zwingend mit denen der Antwortenden decken. Du suchst vielleicht nur einen bestimmten Fehler, wir sind in der Regel dagegen an korrektem Code interessiert.
-
camper schrieb:
Ich kenne Mongo db nicht... aber vom ersten Eindruck her...
std::vector<JsonValue*> payloadList = std::vector<JsonValue*>(); payloadList.clear(); MongoCursor* cursor = DbWrapper::getMongoCursor(DbWrapper::client, DBNAME, COLLECTIONNAME, QUERY, LIMIT, SKIP); // der Aufruf macht den Eindruck, als ob Cursor eine Resource ist, wäre also zu vermuten, dass er irgendwo wieder freigegeben/zerstört werden muss if(!cursor) { Utils::printToConsole("Could not create cursor!"); return payloadList; } const Bson* bson = DbWrapper::createBsonPtr(); // hm... while(!mongoc_cursor_error(cursor, &DbWrapper::error) && mongoc_cursor_more(cursor) && mongoc_cursor_next(cursor, &bson)) // moment mal... cursor_next liest doch aus der Datenbank? // aber der Rückgabewert ist es nicht, also ist vermutlich bson ein Ausgabeparameter? // wieso wurde er dann vorher mit etwas (nicht-leerem) initialisiert? { JsonValue* jsonValue = NULL; // wurde schon angesprochen (*jsonValue) = DbWrapper::convertBsonToJsonValue(bson); payloadList.push_back(jsonValue); } DbWrapper::destroyBson((Bson*)bson); // das würde dann auch nicht so recht passen, wenn bson hier freigegeben werden muss, müsste das nicht in der Schleife auch ständig passieren ? oder eben gar nicht? // könnte natürlich sein, dass die API wirklich so seltsam ist... return payloadList;mal sehen... sieht so aus als ob die API nicht seltsam ist.
Has du das verlinkte Dokument auch selbst mal durchgelesen und das Beispiel nachvollzogen?
Hab ich jetzt das gesuchte Problem gefunden? wahrscheinlich nicht.
TangoQueen schrieb:
Der "Schwachsinnscode" ist so genau richtig
Erfahrungsgemäß eine gewagte Behauptung. Wenn der Fehler nicht gleich offensichtlich ist - andernfalls wäre der Thread ja gar nicht erst enstanden - ist es doch nicht unwahrscheinlich, dass er sich an einer unerwarteten Stelle befindet, oder?
Du solltest auch in Erwägung ziehen, dass sich deine Interessen nicht zwingend mit denen der Antwortenden decken. Du suchst vielleicht nur einen bestimmten Fehler, wir sind in der Regel dagegen an korrektem Code interessiert.@camper: Ich habe mich bei SeppJ bedankt fuer seinen Input. Aber bei Mechanics gefiel mir der Ton nicht: Er ging nicht auf den Fehler ein und musste seine irrelevante Meinung kundtun; er schien sich nicht mal die Muehe zu machen den Code zu verstehen. Ich bilde mir ein das Dokument nachvollzogen zu haben. Und die entsprechende Collection findet sich in der Datenbank. Es ist definitiv nicht der Code in der While schleife.
while(!mongoc_cursor_error(cursor, &DbWrapper::error) && mongoc_cursor_more(cursor)) { JsonValue* jsonValue = DbWrapper::convertBsonToJsonValuePtr(bson); payloadList.push_back(jsonValue); }crashed nicht. Wie gesagt: Dachte hier tummeln sich MongoDb C Experten.
Danke fuer deine Kommentare, aber das alles hatte ich schon bedacht. Der cursor wird bei mir zerstoert, aber am Ende; der Code vor dem Return wurde hier nicht miteingetippt.
Bson wird initialisiert mittels
const Bson* bson = DbWrapper::createBsonPtr();
-
TangoQueen schrieb:
@Mechanics: Ich kenne einen Kerl aus meinem Studium, der alle kritisierte und dann selbst durchgefallen ist. So ein Typ mit Nerd-Shirt und -Brille, der aber irgendwie nie zuhoerte und nie richtig lesen konnte.
Ich glaube ich muss mich hier nicht beleidigen lassen. Vor allem nicht von jemanden, der anstatt das Problem zu loesen sich lieber an Kleinigkeiten auslaesst!
Ja und? Ich arbeite nicht erst seit gestern als Softwareentwickler, ist mir egal, was für skurrile Typen du kennst. Kenn auch genug.
Ja, ich hab mich nicht grad höflich ausgedrückt. Aber ich erwarte auch, dass man in einem Programmierforum damit zurechtkommt. Das spart einfach Zeit und selbst wenn man sich höflich ausdrückt fühlt sich trotzdem jeder sofort auf den Schlipfs getreten.
Natürlich funktioniert der Code, aber das ist trotzdem einfach Bullshit und sowas muss man im Keim ersticken. Das ist langfristig wichtiger, als der eine Crash jetzt. Wenn dir das jetzt egal, ist es dein Problem, und nicht meins.
Was dein konkretes Problem betrifft, ich kenn mich mit mongoDb tatsächlich nicht aus die Vermutung von SeppJ kam mir plausibel vor.
-
Die Codeausschnitte die du hier zeigst sind jedes Mal anders. Im übrigen scheinst du mehr Trial & Error zu programmieren und die Hintergründe gar nicht zu verstehen.
So macht:
JsonValue* jsonValue = NULL; // wurde schon angesprochen (*jsonValue) = DbWrapper::convertBsonToJsonValue(bson);etwas völlig anderes als:
JsonValue* jsonValue = DbWrapper::convertBsonToJsonValuePtr(bson);Ich tippe bei dir auf Undefined Behaviour ausgelöst durch fehlerhafte Benutzung der Lib und/oder eigenen Code.
Das ist nicht mal böste gemeint, aber selbst wenn du das Problem lösen kannst, so wirst du früher oder später auf viel grausamere Probleme stößen. Fang vielleicht lieber mit den Basics an.
-
Vor allem kannst du nicht mit einem Debugger mal in den Code reinschauen?
Wenn du den Source oder die Debugfiles von MongoDB hast, dann kannst sogar in die cursor_next Funktion reinschauen.
Aber bitte sag mir nicht,d ass Debuggen nicht möglich ist.Und zum Offtopic: Ich teile da Mechanics Ansichten. Hier kommen öfters mal Leute an, denen man ansieht, dass sie keinen Plan haben, aber einen auf dicke Hose machen. Und, so leid es mir tut, du machst auch ein bisschen diesen Eindruck.
Dazu kommt, dass dein Code jedes Mal leicht anders aussieht.
-
Skym0sh0 schrieb:
Vor allem kannst du nicht mit einem Debugger mal in den Code reinschauen?
Wenn du den Source oder die Debugfiles von MongoDB hast, dann kannst sogar in die cursor_next Funktion reinschauen.
Aber bitte sag mir nicht,d ass Debuggen nicht möglich ist.Und zum Offtopic: Ich teile da Mechanics Ansichten. Hier kommen öfters mal Leute an, denen man ansieht, dass sie keinen Plan haben, aber einen auf dicke Hose machen. Und, so leid es mir tut, du machst auch ein bisschen diesen Eindruck.
Dazu kommt, dass dein Code jedes Mal leicht anders aussieht.
Ich schaute in den Source code via debugger bevor ich hier gepostet hatte.
Dicke Hose he? Nette Diagnose von jemandem, der mir solch redundante Ratschlaege gibt. Ich habe hier ein konkretes Problem gepostet, ihr konntet es nicht loesen, muesst aber eure ungefragten Sprueche abgeben. Und ein Forum ist dazu da, dass jemand seine Probleme mit anderen bespricht... nur fuer den Fall, dass ihr den Sinn eines Forums nicht kennt.
Ich sage es nochmal: Wenn ihr nichts produktives zu posten habt, lasst es. Ich spreche hier Leute an, die so ein aehnliches Problem ebenfalls hatten.
> "Dazu kommt, dass dein Code jedes Mal leicht anders aussieht."
Oh mein Gott, du hast mich erwischt. Du solltest Psychologe werden!!! Wenn doch nur alle Kriminalisten dein Gespuer fuer Beweismaterial haetten, wir haetten keine Verbrechen mehr...> "Was dein konkretes Problem betrifft, ich kenn mich mit mongoDb tatsächlich nicht aus"
Dann halt den Mund!!!> "Ja und? Ich arbeite nicht erst seit gestern als Softwareentwickler, ist mir egal, was für skurrile Typen du kennst. Kenn auch genug.
Ja, ich hab mich nicht grad höflich ausgedrückt. Aber ich erwarte auch, dass man in einem Programmierforum damit zurechtkommt. Das spart einfach Zeit und selbst wenn man sich höflich ausdrückt fühlt sich trotzdem jeder sofort auf den Schlipfs getreten.
Natürlich funktioniert der Code, aber das ist trotzdem einfach Bullshit und sowas muss man im Keim ersticken. Das ist langfristig wichtiger, als der eine Crash jetzt. Wenn dir das jetzt egal, ist es dein Problem, und nicht meins.
Was dein konkretes Problem betrifft, ich kenn mich mit mongoDb tatsächlich nicht aus die Vermutung von SeppJ kam mir plausibel vor."
Ich nehme deine Entschuldigung an. Ich merke an diesem Abschnitt, dass du insgeheim weisst, dass du einen Fehler gemacht hast, aber natuerlich kannst du nicht einfach ein Entschuldigung aussprechen. Aber ich kann zwischen den Zeilen lesen...
-
Bitte Thread schließen.