2010-02-23 13 views
8

Mein Server-Daemon funktioniert auf den meisten Maschinen jedoch auf einer feinen Ich erhalte:sYSMALLOc: Assertion fehlgeschlagen - irgendwelche Ideen, wie effektiv debuggen?

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 anderes zu versuchen? Ich kann keinen Fehler in meinem Code finden, es könnte ein Fehler in der XMPP-Bibliothek sein, und das muss ich herausfinden.

Danke.

+1

Kompilieren Sie Ihren Deamon mit '-O0' (keine Optimierung) - vielleicht Parameterwerte in acktrace für '_int_malloc' und' sYSMALLOc' werfen etwas Licht – qrdl

+2

Ich stimme zu, neu kompilieren ohne Optimierungen und sicher sein, Debugging-Symbole dann enthalten Führe es durch Valgrind. Die Valgrind-Ausgabe ist tatsächlich viel hilfreicher bei der Diagnose als das Rauschen, das die Assertion wirft. –

Antwort

2

Die Behauptung zeigt fast sicher eine Art von Speicherbeschädigung vor einem Aufruf an malloc an. Angesichts der Tatsache, dass die Behauptung in xmpp_ctx_new, die ein sehr früher Anruf in der libstrophe XMPP-Bibliothek zu sein scheint, stolpert, würde ich sagen, es ist sehr wahrscheinlich, dass der Fehler in Ihrem Code ist (obwohl es nicht sein kann, wenn Sie mehrere XMPP zuweisen Kontexte - nicht sicher, ob es einen Grund gibt, das zu tun.

Wenn Sie nur einen XMPP-Kontext zuweisen, können Sie den Fehler auf Ihren Code isolieren, indem Sie vor dem Aufruf von xmpp_ctx_new einen Aufruf an malloc(sizeof(xmpp_ctx_t)) eingeben, und Sie werden das Problem nicht in libstrophe finden. (Übrigens bin ich mir ziemlich sicher, dass das Problem nicht in diesem Anruf zu xmpp_ctx_new sein wird, da ich die Quelle zur Funktion Google googgte (mem = 0x0 sah wahrscheinlich Probleme verursachen), und sah, dass es im Grunde auf malloc und a reduziert wurde einige Initialisierer - Lesen der Quelle ist in der Regel eine gute Strategie für die Suche nach Fehlern in OSS.)

6

Dies ist fast sicher aufgrund eines Heap-Fehler in Ihrem Code (Schreiben kurz vor oder direkt nach einem zugewiesenen Block).

Da Sie anscheinend unter Linux sind, ist das Werkzeug hier zu verwenden ist Valgrind. Es sollte Sie direkt auf das Problem hinweisen, und zwar auch auf Rechnern, auf denen Ihr Daemon "funktioniert".

Versuchen Sie etwas anderes als Valgrind für diese Art von Problem ist wahrscheinlich eine Verschwendung von Zeit.

Verwandte Themen