sYSMALLOc: Утверждение перестало работать - какие-либо идеи, как отладить эффективно?

Мой демон сервера хорошо работает на большинстве машин однако на одной, я добираюсь:

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:

#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, и я должен определить это.

Спасибо.

8
задан 23 February 2010 в 10:02
поделиться

2 ответа

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

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

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

6
ответ дан 5 December 2019 в 20:16
поделиться

Утверждение почти наверняка указывает на какое-то повреждение памяти до вызова 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.)

2
ответ дан 5 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: