Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > malloc


Автор: MAKCim 28.9.2006, 17:27
программа падает c SIGABRT при вызове malloc
что за программа не имеет значения - проблема точно локализована - что-то с malloc, причем malloc вызывается в цикле, и падает после 2-ух успешных вызовов
вот что glibc пишет
Цитата

*** glibc detected *** ./main: malloc(): memory corruption: 0x0806b0b0 ***
======= Backtrace: =======
...

в чем может быть дело?

Автор: kirjanov 28.9.2006, 18:32
Этот сигнал сгенерирован, когда недопустимый указатель применяется. Подобно SIGSEGV, этот сигнал - обычно результат применения неинициализированного указателя.

Автор: MAKCim 28.9.2006, 22:08
Цитата

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

Да я знаю что это за сигнал и когда он генерируется
Вопрос в другом. В чем может быть причина, что вылетает библиотечная функция?

Автор: smalcom 29.9.2006, 07:23
>>В чем может быть причина, что вылетает библиотечная функция?

может магнитная активность солнца, может изза самостоятельной пересборки glibc или еще какого пакета который косвенно на это влияет. А может прога из нескольких тредов

Автор: MAKCim 29.9.2006, 15:49
Цитата

может магнитная активность солнца

 smile 
Цитата

может изза самостоятельной пересборки glibc

нет
Цитата

А может прога из нескольких тредов

к моменту вызова поток один

Автор: smalcom 29.9.2006, 17:50
приду домой попробую покопать. если не сложно приблизетельно плюс минус две три строки от малока надо увидеть

Автор: MAKCim 29.9.2006, 18:50
Цитата

если не сложно приблизетельно плюс минус две три строки от малока надо увидеть 

да в принципе все стандартно
Код

event_t* make_event()
{
    event_t* event = (event_t*) malloc(sizeof(event_t));
    if (event == NULL)
        return NULL;
...
    return event;
}

Код

typedef struct _event
{
...
} event_t;

Автор: smalcom 29.9.2006, 20:37
скомпилил я у ся сей кусок все тип-топ. причина может быть в некоректной работе sizeof или его входных параметров, могу пока порекомендовать поиграть с MALLOC_CHECK_ и кусок кода сделать чуть иначе штобы видеть плотнее что происходит.

Код

uint t = sizeof(event_t);
event_t* event = (event_t*) malloc(t);



Автор: smalcom 30.9.2006, 00:37
я так понял все писяно на сях в коих я не очень попробуй на плюсах хотя интересней разобраца в сути проблемы

Автор: kirjanov 30.9.2006, 08:35
MAKCim, 
поставь бряк на адрес и глянь дизассемблированный код функции. 

Автор: MAKCim 30.9.2006, 09:36
Спасибо всем за участие  - проблема сама собой решилась
Самое интересное, что якобы глючный код я не трогал, а слегка изменил совсем другой участок программы
Вот все как взаимосвязано оказывается  smile 

Автор: smalcom 30.9.2006, 13:26
>>> Да я знаю что это за сигнал и когда он генерируется <<<

Накричал тут значит

>>> проблема точно локализована - что-то с malloc <<<

наехал на glibc(как програмист под винду ей-богу - раз моя прога не работает значит вонь is sux)

P.S. хоть бы сказал в чем дело было, а вдруг завтра я или еще кто тупо опять сидит перед дебаггером кроет матом glibc задалбывает форумы и знакомых по аське палит кучу трафика, а ведь можно всего было избежать. Ща погибнет весь автобус

Автор: MAKCim 30.9.2006, 14:54
Цитата

наехал на glibc

Понимаешь в чем дело, ошибка то вылетала именно в malloc-е
Это было четко видно по логам и в gdb, так что наезды не беспочвенны (может, даже скорее всего, malloc валился из-за косвенных, не относящихся к самой glibc, причин - но внешне все сводилось к ошибке в malloc-е)
Прежде чем сюда писать я досконально все проверил, не из-за кривизны ли моих рук все валится
Цитата

хоть бы сказал в чем дело было

Я и сам не знаю, тот кусок, который исправил, не влиял на кусок кода, который падал
Так что сказать ничего не могу...пока

Автор: regis 2.10.2006, 11:21
Судя по всему, запорчены были заголовки блоков памяти кучи, о чем malloc прямо и сообщает. Ошибка, конечно, не в malloc, а где-то в другом месте программы. Стоит проверить все критичные операции записи через указатели, если не поможет -- использовать для отладки что-нибудь вроде ElectricFence.

Автор: MAKCim 2.10.2006, 15:36
Цитата

Стоит проверить все критичные операции записи через указатели

Боюсь времени нет, тем более все работает
Хотя было бы интересно

Автор: dmiceman 3.10.2006, 02:12
о да! обожаю такие ошибки! помнится во времена когда ничего вроде efence небыло, отлавливал я такого рода багу неделю. не помню уже -- отловил или нет :-) рождается такая бага обычно совсем другом месте программы, совсем в другом исходнике, минут за пять до славливания сигнала. и тихо ждет своего часа. это может быть что угодно -- от переполнения на один байт, от непоставленного нолика в конце строки после strncpy(), все что угодно. даже совсем не обязательно в твоем коде.

но! времена меняются. попробуй просто прогнать прожку под valgrind -- десять к одному он тебе все расскажет и на блюдечке принесет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)