Ausgeschlossen dass der Fehler bei mir liegt?



  • Hoi,
    ich bekomme gerade permanent Segfaults um die Ohren. Hier mal die ersten 4 Frames aus dem Backtrace:

    #0  0x00000034c847c75b in _int_malloc () from /lib64/libc.so.6
    #1  0x00000034c847f4b3 in malloc () from /lib64/libc.so.6
    #2  0x00000034cfc5f58d in operator new(unsigned long) () from /lib64/libstdc++.so.6
    #3  0x000000000042dc8a in Synthetic::Util::makeUnique<Synthetic::EComponents::RenderableComponent, Synthetic::SpriteTextureData, unsigned int const&>(Synthetic::SpriteTextureData&&, unsigned int const&) ()
    

    Gibt es eine Möglichkeit operator new/malloc falsch zu benutzen? Falls nicht muss es ja ein Bug in der malloc Implementierung sein?

    Danke und Grüße,
    Ethon


  • Mod

    Ethon schrieb:

    Gibt es eine Möglichkeit operator new/malloc falsch zu benutzen?

    Ja, jede Menge.

    Falls nicht muss es ja ein Bug in der malloc Implementierung sein?

    Nun, was glaubst du? Dass du den Bug entdeckt hast, den noch niemand kannte, oder dass der Fehler bei dir liegt?

    Höchstwahrscheinlich hast du dir den Heap zerschossen. Das ist übrigens einer der Fälle, wo der eigentliche Fehler ganz woanders liegt als der spätere Segfault. Das ist der Moment, wo die Debugoptionen der STL (aber du benutzt ja new) glänzen würden. Alternativ auch Programme wie valgrind, mit denen solche Fehler schnell gefunden und analysiert sind.



  • Ethon schrieb:

    Gibt es eine Möglichkeit operator new/malloc falsch zu benutzen? Falls nicht muss es ja ein Bug in der malloc Implementierung sein?

    Das tritt eigentlich immer auf, wenn du mit Pointern rumspielst oder bei über die Arraygrenzen hinaus auf fremden Speicher zugreifst. Wenn du mallocs interne Verwaltungsdaten überschreibst, kracht es halt bei malloc.

    Schonmal valgrind versucht?



  • Hat eigentlich Mal irgendjemand eine Empfehlung für ein Windows-valgrind?



  • Meistens (also bei mir meistens) liegt der Fehler daran, dass ich auf einen nicht initalisierten Pointer zugreife. (Ja ich weiß, Konstruktoren sind was tolles 🙄 )



  • Nathan schrieb:

    nicht initalisierten Pointer

    Wozu benutzt du Pointer?



  • Für einen änderbaren, ab und zu ungültigen Verweis auf ein Objekt.



  • Hui ... danke für den Wink mit dem Zaunpfahl bezüglich valgrind.
    Ich scheine boost::intrusive_ptr falsch zu benutzen ... die Fehlersuche wird lustig. 😋



  • Hat eigentlich Mal irgendjemand eine Empfehlung für ein Windows-valgrind?

    Application Verifier + DebugDiag

    Ist nicht so leistungsfähig, aber kostenlos.



  • So, der fehler war dass ich in der Funktion zum dekrementieren des Referenzzählers die Logik verdreht hatte und delete this aufgerufen habe, wenn der Refcount != 0 ist ... hat mich einige Stunden gekostet, zum Kotzen soetwas. 😉


Anmelden zum Antworten