Мой демон сервера хорошо работает на большинстве машин однако на одной, я добираюсь:
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, и я должен определить это.
Спасибо.
Это почти наверняка связано с ошибкой повреждения кучи в вашем коде (запись непосредственно перед или сразу после выделенного блока).
Поскольку вы, очевидно, работаете в Linux, инструмент , который можно использовать здесь, - это Valgrind . Он должен указать вам прямо на проблему, и это должно быть сделано даже на машинах, на которых ваш демон «работает».
Попытки решить эту проблему с помощью чего-либо другого, кроме Valgrind, вероятно, будут пустой тратой времени.
Утверждение почти наверняка указывает на какое-то повреждение памяти до вызова 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.)