Мне трудно отследить ошибку в нативном C-коде в моем приложении для Android. Этот код находится в Wireshark, который я перенес на Android. Я много раз запускал один и тот же код на x86 под Valgrind и GDB и никогда не смог найти проблемы с ним. Однако, когда он работает на Android, он, кажется, ведет себя по-другому и вызывает сбои сегментации очень часто (например, после запуска ~ 100 раз).
Если честно, я не очень хорошо понимаю синтаксис кода, поэтому мне трудно понять, какие предположения можно было бы сделать для машины x86, которая не относится к процессору на базе ARM.
По сути, он пытается обойти постоянное выделение новой памяти и освобождение ее, помещая память в «корзину» и позволяя ее повторно использовать. Является ли это на самом деле лучше с точки зрения производительности - это отдельный вопрос. Я просто пытаюсь принять уже существующий код. Но для этого у него есть пара основных макросов:
#define SLAB_ALLOC(item, type) \
if(!type ## _free_list){ \
int i; \
union type ## slab_item *tmp; \
tmp=g_malloc(NITEMS_PER_SLAB*sizeof(*tmp)); \
for(i=0;i<NITEMS_PER_SLAB;i++){ \
tmp[i].next_free = type ## _free_list; \
type ## _free_list = &tmp[i]; \
} \
} \
item = &(type ## _free_list->slab_item); \
type ## _free_list = type ## _free_list->next_free;
#define SLAB_FREE(item, type) \
{ \
((union type ## slab_item *)item)->next_free = type ## _free_list; \
type ## _free_list = (union type ## slab_item *)item; \
}
Затем пара поддерживаемых макросов для определенных типов:
#define SLAB_ITEM_TYPE_DEFINE(type) \
union type ## slab_item { \
type slab_item; \
union type ## slab_item *next_free; \
};
#define SLAB_FREE_LIST_DEFINE(type) \
union type ## slab_item *type ## _free_list = NULL;
#define SLAB_FREE_LIST_DECLARE(type) \
union type ## slab_item *type ## _free_list;
Кто-нибудь распознает какие-либо предположения на x86, которые могут не работать на телефоне Android? В конце концов происходит то, что SLAB_ALLOC () вызывается, и он возвращает что-то из списка. Затем следующий код пытается использовать память и ошибки приложения. Это приводит меня к мысли, что он обращается к недействительной памяти Это происходит непредсказуемо, но всегда происходит при первой попытке использовать память, возвращаемую SLAB_ALLOC ().