Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

20.08.2014, 22:24

[Solved]Debug Assertion Failed!

Nabend,

Wie im Titel schon erwähnt, habe ich genau diese Fehlermeldung (Screenshot im Anhang). Der Fehler tritt auf, sobald ich das Programm verlasse (return 0; von der main).

Ich habe schon ne Menge im Internet gesucht und herausgefunden, dass der Fehler wohl im Zusammenhang mit Zeigern auftritt. Allerdings bin ich der Meinung, dass alle Zeiger im Code richtig behandelt werden. Ich habe meinen eigentlichen Code soweit heruntergebrochen, dass ich bei diesem Code(siehe unten) gelandet bin. Ich hoffte, dass ich so den Fehler finde, aber auch bei diesem kleinen Beispiel kommt der Fehler.


Aktueller Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
int main()
{
    // Prepare our context and socket
    zmq::context_t context(1);
    zmq::socket_t socket(context, ZMQ_REP);
    socket.bind("tcp://127.0.0.1:5555");



        zmq::message_t request;

        // Wait for next request from client
        socket.recv(&request,0);

        MainMessage message;

        message.ParseFromArray(request.data(),request.size());
        MessageLogin login = message.GetExtension(MessageLogin::Login);
        std::string user = login.username();
        std::string pw = login.password();
        std::cout << message.header().msgid() << std::endl;
        std::cout << user << std::endl;
        std::cout << pw << std::endl;
        
        message.ClearExtension(MessageLogin::Login);
        message.Clear();

        // Send reply back to client

        MainMessage proto_reply;
        MessageHeader header;
        header.set_msgid(1);
        header.set_sid(0);
        proto_reply.set_allocated_header(&header);
        MessageBool *b = proto_reply.MutableExtension(MessageBool::Bool);
        b->set_successfull(true);

        
        int size = proto_reply.ByteSize();
        char* bytes = new char[size];
        try
        {
            proto_reply.SerializeToArray(bytes, size);
        }
        catch (google::protobuf::FatalException fe)
        {
            std::cout << "ERROR: " << fe.message() << std::endl;
        }
        zmq::message_t reply(size);
        
        memcpy(reply.data(), bytes, size);

        zmq::context_t ct(2);
        zmq::socket_t st(ct, ZMQ_REQ);
        st.connect("tcp://127.0.0.1:5554");
        try
        {
            st.send(reply);
        }
        catch (const zmq::error_t ze)
        {
            std::cout << "Exception: " << ze.what() << std::endl;
        }

    socket.close();
    st.close();
    context.close();
    ct.close();
    
    delete b;
    delete[] bytes;
    //system("pause");

    return 0;
}


Irgendwo muss ich aber einen Fehler übersehen, deswegen hoffe ich, dass ihn einer von euch findet und mich erlöst :)

Schonmal ein Danke im voraus, für alle die sich Zeit nehmen für mein Problem :)
»ERROR« hat folgendes Bild angehängt:
  • error.PNG

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ERROR« (21.08.2014, 09:46)


FSA

Community-Fossil

  • Private Nachricht senden

2

20.08.2014, 22:30

Muss das Objekt MessageBool *b = proto_reply.MutableExtension(MessageBool::Bool); wirklich gelöscht werden?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

3

20.08.2014, 22:36

Wenn ich die Zeile in der b gelöscht wird auskommentiere, kommt trotzdem der Fehler.

4

20.08.2014, 22:46

Ist b ein valider pointer?
Welchen Wert hat size?
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

5

21.08.2014, 00:00

Was tut denn die close Funktion? Ich sehe in der Doku nichts davon. Dort steht nur, dass der Destruktor von sich aus zmq_close aufruft. Wenn die close Funkdtion das auch tut, würde beim Verlassen des Scope, also dem return, ein zweites mal zmq_close aufgerufen. Passt gut auf deine Beschreibung.

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

6

21.08.2014, 00:07

Wie finde ich raus, ob b ein valider Pointer ist?

size hat den Wert 11.

Die Close Funktionen habe ich aufgerufen um zu testen, ob es vielleicht an denen lag. Auskommentiert tritt der Fehler trotzdem auf.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

21.08.2014, 06:56

Sicher, dass das so richtig ist?
memcpy(reply.data(), bytes, size);
Wenn das nämlich nur über die rebuild-Methode oder den richtigen Konstruktor [message_t (void *data_, size_t size_,...] gemacht werden sollte, hast Du da ein Problem. Wenn ich mir die Konstruktoren so anschaue, sollte das aber eigentlich passen.
Das Löschen von b ist sicher allerdings ziemlich sicher falsch. Um zu sehen, ob b einen gültigen Wert hat, wäre ein Blick im Debugger darauf sinnvoll. 0 oder nullptr sind dabei keine gültigen Werte.
Ich hoffe Du hast auch mal mehrere der Vorschläge gleichzeitig durchgeführt, denn Du mehr als einen Fehler drin hast, geht der andere natürlich nicht weg, wenn Du jeweils nur einen korrigierst.
Kommentier doch mal von 39 bis 64 alles aus und schau, was passiert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BlueCobold« (21.08.2014, 07:05)


buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

8

21.08.2014, 07:56

Ich denke mal, es liegt an diesem Aufruf

C-/C++-Quelltext

1
MessageBool *b = proto_reply.MutableExtension(MessageBool::Bool);

Am ende rufst Du ja delete b auf. Genau das ist dann das Problem. Dieser Pointer wird 100% in der MainMessage im Destruktor
gelöscht. Der Destruktor wird aufgerufen, wenn proto_reply aus dem Scope geht. Vorher rufst Du aber schon ein delete b.
Das ist nicht nett der Klasse MainMessage gegenüber.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

21.08.2014, 07:57

Bitte vorher alle Beiträge lesen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

10

21.08.2014, 08:53

Selbstverständlich habe ich alle Lösungen immer gleichzeitg probiert ;)
b ist ein valider Pointer, ich dachte erst es gäbe irgendeine andere Methode als den Debugger ... :D . Die Dinge wie "delete b" usw waren eigentlich gar nicht erst im Code drin, ich habe sie nur reingepackt, um zu sehen ob der Fehler dadurch behoben wird. Die memcpy wird bei mir in etwa so angegeben void * memcpy ( void * destination, const void * source, size_t num );.

Ich habe deinen Rat befolgt BC und die Zeilen 39 - 64 auskommentiert ( Ich habe es dirket bis 71 gemacht) -> Der Fehler kommt immer noch. Einfach mal munter weiter auskommentiert und rum probiert. Es stellte sich heraus, der Fehler liegt in dieser Zeile :34 proto_reply.set_allocated_header(&header);. Dann ist mir aufgefallen, dass die Methode garantiert einen Zeiger auf einen Bereich im Heap will. Also MessageHeader header in MessageHeader *header geändert und alles funktioniert.

War mal wieder irgendwie sehr unnötig der Fehler ...

Möchte mich bei euch allen wirklich sehr bedanken, dass ihr euch Zeit genommen habt und mir geholfen habt das Problem zu lösen :thumbsup:

Werbeanzeige