sYSMALLOc: Assertion-Fehler - irgendwelche Ideen, wie zum Debuggen effektiv?
Meine server-daemon funktioniert gut auf den meisten Maschinen aber auf eines bin ich immer:
malloc.c:3074: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1)
- 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) ||
((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct
malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) -
1)))&& ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
gdb backtrace:
#4 0x002a8300 in sYSMALLOc (av=<value optimised out>, bytes=<value optimised out>) at malloc.c:3071
#5 _int_malloc (av=<value optimised out>, bytes=<value optimised out>) at malloc.c:4702
#6 0x002a9898 in *__GI___libc_malloc (bytes=16) at malloc.c:3638
#7 0x0804d575 in xmpp_ctx_new (mem=0x0, log=0x0) at src/ctx.c:383
#8 0x0804916e in main (argc=1, argv=0xbffff834) at ../src/adminbot.c:277
Irgendwelche Ideen, was zu versuchen sonst ? Ich bin nicht in der Lage zu finden, einen Fehler in meinem code, es könnte ein bug im XMPP-Bibliothek und ich muss feststellen, dass.
Dank.
- Re-kompilieren der Dämon mit
-O0
(keine Optimierung) - vielleicht die parameter-Werte in acktrace für_int_malloc
undsYSMALLOc
beleuchten - Ich bin damit einverstanden, kompilieren, ohne Optimierungen, und sicher sein, um die debugging-Symbole, dann führen Sie es durch valgrind. Die Valgrind-Ausgabe ist eigentlich viel mehr hilfreich bei der Diagnose dieser als der Lärm der Behauptung wirft.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist fast zweifellos wegen einer heap-Beschädigung, Fehler in Ihrem code (schreiben kurz vor oder kurz nach einem zugewiesenen block).
Da du anscheinend unter Linux die tool zu verwenden, hier ist Valgrind. Sollte es Punkt, den Sie gerade auf das problem, und so sollte dies auch auf Maschinen, wo Ihre daemon "funktioniert".
Versuchen, etwas anderes als Valgrind für diese Art von problem ist wahrscheinlich eine Verschwendung von Zeit.
Die Geltendmachung fast gibt sicherlich einige Art von Speicher Korruption vor, um einen Anruf zu
malloc
. Gegeben, dass die Aussage stolpern inxmpp_ctx_new
, die offenbar zu einem sehr frühen Anruf in derlibstrophe
XMPP-Bibliothek, ich würde sagen, es ist sehr wahrscheinlich, dass der Fehler in Ihrem code sein (obwohl es nicht sein kann, wenn Sie die Zuteilung mehrere XMPP-Kontexte - nicht sicher, ob es irgendeinen Grund, das zu tun).Wenn Sie nur die Zuweisung eines XMPP-Rahmen, können Sie isolieren den bug, um Ihren code, indem Sie einen Aufruf
malloc(sizeof(xmpp_ctx_t))
vor dem Aufrufxmpp_ctx_new
, und du wirst sehen das problem nicht in libstrophe. (Übrigens, ich bin mir ziemlich sicher, dass das problem nicht in diesem Aufrufxmpp_ctx_new
weil ich google würde die Quelle zu der Funktion (mem=0x0 sah wahrscheinlich, Probleme zu verursachen), und sah, dass es im Grunde reduziert aufmalloc
und ein paar Initialisierungen - Lesen der Quelle ist in der Regel eine gute Strategie für die Suche nach bugs in OSS.)