LINUX.ORG.RU

[ANSI C][dynamic library][malloc] Ошибка при выделении памяти.

 ,


0

3

Внезапно возникла проблема. Суть: из главного приложения загружается модуль (файл omps.blob)

dlopen(modulePath, RTLD_GLOBAL | RTLD_NOW);
Необходимая функция (systemRun) внутри модуля успешно запускается. Однако, если внутри неё лежит что-то, типа
char *x;
x = malloc(1024);
функция malloc высыпает длиннющий трап
corrupted double-linked list: 0x00000000006267d0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x731fd)[0x7ffff76d81fd]
/lib64/libc.so.6(+0x7363d)[0x7ffff76d863d]
/lib64/libc.so.6(+0x75994)[0x7ffff76da994]
/lib64/libc.so.6(__libc_malloc+0x62)[0x7ffff76dcfc2]
./libs/omps.blob(systemRun+0x12)[0x7ffff71cd9be]
/home/darkamateur/NetBeansProjects/PureServer/dist/Debug/GNU-Linux-x86/pureserver[0x401f48]
/lib64/libc.so.6(__libc_start_main+0xec)[0x7ffff7683d4c]
/home/darkamateur/NetBeansProjects/PureServer/dist/Debug/GNU-Linux-x86/pureserver[0x400fa9]
======= Memory map: ========
00400000-00403000 r-xp 00000000 08:03 410033536                          /home/darkamateur/NetBeansProjects/PureServer/dist/Debug/GNU-Linux-x86/pureserver
00602000-00603000 r--p 00002000 08:03 410033536                          /home/darkamateur/NetBeansProjects/PureServer/dist/Debug/GNU-Linux-x86/pureserver
00603000-00604000 rw-p 00003000 08:03 410033536                          /home/darkamateur/NetBeansProjects/PureServer/dist/Debug/GNU-Linux-x86/pureserver
00604000-00647000 rw-p 00000000 00:00 0                                  [heap]
7ffff0000000-7ffff0021000 rw-p 00000000 00:00 0 
7ffff0021000-7ffff4000000 ---p 00000000 00:00 0 
7ffff6fb6000-7ffff6fcc000 r-xp 00000000 08:02 35699456                   /lib64/libgcc_s.so.1
7ffff6fcc000-7ffff71cb000 ---p 00016000 08:02 35699456                   /lib64/libgcc_s.so.1
7ffff71cb000-7ffff71cc000 r--p 00015000 08:02 35699456                   /lib64/libgcc_s.so.1
7ffff71cc000-7ffff71cd000 rw-p 00016000 08:02 35699456                   /lib64/libgcc_s.so.1
7ffff71cd000-7ffff71ce000 r-xp 00000000 08:03 287385734                  /home/darkamateur/NetBeansProjects/PureServer/dist/Debug/GNU-Linux-x86/libs/omps.blob
7ffff71ce000-7ffff73cd000 ---p 00001000 08:03 287385734                  /home/darkamateur/NetBeansProjects/PureServer/dist/Debug/GNU-Linux-x86/libs/omps.blob
7ffff73cd000-7ffff73ce000 r--p 00000000 08:03 287385734                  /home/darkamateur/NetBeansProjects/PureServer/dist/Debug/GNU-Linux-x86/libs/omps.blob
7ffff73ce000-7ffff73cf000 rw-p 00001000 08:03 287385734                  /home/darkamateur/NetBeansProjects/PureServer/dist/Debug/GNU-Linux-x86/libs/omps.blob
7ffff73cf000-7ffff7665000 r--p 00000000 08:02 33589112                   /usr/lib64/locale/locale-archive
7ffff7665000-7ffff77c3000 r-xp 00000000 08:02 105039799                  /lib64/libc-2.12.2.so
7ffff77c3000-7ffff79c3000 ---p 0015e000 08:02 105039799                  /lib64/libc-2.12.2.so
7ffff79c3000-7ffff79c7000 r--p 0015e000 08:02 105039799                  /lib64/libc-2.12.2.so
7ffff79c7000-7ffff79c8000 rw-p 00162000 08:02 105039799                  /lib64/libc-2.12.2.so
7ffff79c8000-7ffff79cd000 rw-p 00000000 00:00 0 
7ffff79cd000-7ffff79cf000 r-xp 00000000 08:02 105588081                  /lib64/libdl-2.12.2.so
7ffff79cf000-7ffff7bcf000 ---p 00002000 08:02 105588081                  /lib64/libdl-2.12.2.so
7ffff7bcf000-7ffff7bd0000 r--p 00002000 08:02 105588081                  /lib64/libdl-2.12.2.so
7ffff7bd0000-7ffff7bd1000 rw-p 00003000 08:02 105588081                  /lib64/libdl-2.12.2.so
7ffff7bd1000-7ffff7bdd000 r-xp 00000000 08:02 68301435                   /usr/lib64/libconfig.so.9.1.1
7ffff7bdd000-7ffff7ddc000 ---p 0000c000 08:02 68301435                   /usr/lib64/libconfig.so.9.1.1
7ffff7ddc000-7ffff7ddd000 r--p 0000b000 08:02 68301435                   /usr/lib64/libconfig.so.9.1.1
7ffff7ddd000-7ffff7dde000 rw-p 0000c000 08:02 68301435                   /usr/lib64/libconfig.so.9.1.1
7ffff7dde000-7ffff7dfc000 r-xp 00000000 08:02 105039807                  /lib64/ld-2.12.2.so
7ffff7fd6000-7ffff7fd9000 rw-p 00000000 00:00 0 
7ffff7ff7000-7ffff7ff8000 rw-p 00000000 00:00 0 
7ffff7ff9000-7ffff7ffb000 rw-p 00000000 00:00 0 
7ffff7ffb000-7ffff7ffc000 r-xp 00000000 00:00 0                          [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 0001e000 08:02 105039807                  /lib64/ld-2.12.2.so
7ffff7ffd000-7ffff7ffe000 rw-p 0001f000 08:02 105039807                  /lib64/ld-2.12.2.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0 
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Если количество запрашиваемой памяти уменьшить и взять, например, 120 байтов, то всё проходит на ура.

Что поскажет ЛОР?

★★★★

Последнее исправление: DarkAmateur (всего исправлений: 5)

>The UNIX 98 standard requires malloc(), calloc(), and realloc() to set errno to ENOMEM upon failure. Glibc assumes that this is done (and the glibc versions of these routines do this); if you use a private malloc implementation that does not set errno, then certain library routines may fail without having a reason in errno.

man malloc. derp?

anonymous
()

покажите более полный код основного приложения, модуля и Makefile - без этого нужны телепаты, а они куда-то разъехались :)

MKuznetsov ★★★★★
()

Кто-то нагадил в память и повредил внутренние структуры аллокатора. Используй valgrind.

Deleted
()

Дистр, ядро, версия компилятора, версия glibc - где написано? А нигде. Ну да ладно, на правах телепата: подключаемый модуль собран на другой машине, и у тебя нет исходников?
Если совсем NO WAI, напиши тут жаббер, я стукну.

Number_Seven
()

Ещё предложение: попробуй для теста слинковаться с этой библиотекой и воспроизвести. Если трабла воспроизведётся, то получишь вменяемый стек и корку.

И валгринд тоже будет полезен.

DELIRIUM ☆☆☆☆☆
()

>длиннющий трап

это не трап, а карта памяти и backtrace :)

без кода можно мало о чём судить

Если количество запрашиваемой памяти уменьшить и взять, например, 120 байтов, то всё проходит на ура.

это ни о чём не говорит, список может быть как угодно повреждён, в том числе и так, что выделение <1024 проходит

/home/darkamateur/NetBeansProjects/PureServer/dist/Debug/GNU-Linux-x86/pureserver[0x401f48]

баг скорее всего здесь

./libs/omps.blob(systemRun+0x12)[0x7ffff71cd9be]

либо здесь, если malloc вызывается глубоко внутри блоба

проверить можно сразу вызвав malloc в начале функции

sched
()

Бага где-то в pureserver, буду ковыряться valgrindом.

DarkAmateur ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.