sYSMALLOc: Утверждение не удалось - есть идеи, как эффективно отлаживать? - PullRequest
8 голосов
/ 23 февраля 2010

Мой серверный сервер работает нормально на большинстве машин, но на одной из них я получаю:

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

Есть идеи, что еще попробовать? Я не могу найти ошибку в своем коде, это может быть ошибка в библиотеке XMPP, и мне нужно это определить.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 24 февраля 2010

Это почти наверняка связано с ошибкой повреждения кучи в вашем коде (запись непосредственно перед или сразу после выделенного блока).

Поскольку вы, очевидно, работаете в Linux, инструмент для использования здесь Valgrind . Он должен указать вам прямо на проблему, и это должно быть сделано даже на машинах, где ваш демон "работает".

Попытка использовать что-либо кроме Valgrind для решения этой проблемы, вероятно, пустая трата времени.

2 голосов
/ 23 февраля 2010

Утверждение почти наверняка указывает на некоторое повреждение памяти до вызова malloc. Учитывая, что утверждение срабатывает в xmpp_ctx_new, что представляется очень ранним вызовом в библиотеке libstrophe XMPP, я бы сказал, что вполне вероятно, что ошибка в вашем коде (хотя она может не быть, если вы выделяете несколько контекстов XMPP - не уверен, есть ли для этого причина).

Если вы выделяете только один контекст XMPP, вы можете изолировать ошибку в своем коде, вставив вызов malloc(sizeof(xmpp_ctx_t)) перед вызовом xmpp_ctx_new, и вы увидите, что проблема не в libstrophe. (Между прочим, я почти уверен, что проблема не в этом вызове xmpp_ctx_new, потому что я google сделал исходный код функции (mem = 0x0 выглядел, вероятно, вызовет проблемы), и увидел, что она в основном уменьшена до malloc и несколько инициализаторов - чтение исходного кода обычно является хорошей стратегией для поиска ошибок в OSS.)

...