LINUX.ORG.RU

Segmentation fault


0

0

В программу закралась ошибка, пытаюсь выловить.
Код выложить не могу.
В произвольных местах программа сегфолится.
В стандартный вывод пишет:

free(): invalid pointer 0x9151a18!
Segmentation fault

или 

free(): invalid pointer 0x9f27d50!
free(): invalid pointer 0x9f61ba8!
Segmentation fault

или просто

Segmentation fault

В Xemacs в буфере Compilation (если запускать через него) выводит:

free(): invalid pointer 0x8d6eb88!
Compilation exited abnormally with code 139 at Sun Jul 25 01:40:49

Причем всегда код один и тот же - 139.

Можно ли по приведенной информации узнать хотя бы о природе ошибки?
anonymous

Ответ на: комментарий от no-dashi

>>man malloc на предмет MALLOC_CHECK_
Фига себе - не знал что такое есть.

anonymous
()
Ответ на: комментарий от no-dashi

2 no-dashi
Т.е. ошибка связана с malloc?
В программе используется всего один malloc (выделяется память под массив данных).

/* создаем новый тип данных */
struct S {
	gint in; 
	gboolean bo;
	gchar *ch;
};

int i = ...;
int j;

/* создаем массив из i элементов типа S, память выделяю так: */
struct S * my_massive = (struct S *)malloc(i*sizeof(struct S));

/* заполняем массив */
for(j=0; j<i; j++) {
	/* в зависимости от ситуации значения присваиваются разные, но
	для экономии места сделаем все элементы одинаковыми */
	my_massive[j].in = 2003;
	my_massive[j].bo = FALSE;
	my_massive[j].ch = g_strdup("hello");
}

/* ... skipped ... */

/* my_massive больше не используется, высвобождаем память */
free(my_massive);

/*
где здесь может быть ошибка, я не понимаю, может у кого будут соображения?
или я неправильно высвобождаю память?
*/

anonymous
()
Ответ на: комментарий от anonymous

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

В gdb при сегфоле пишет:

Program received signal SIGSEGV, Segmentation fault.
0x009c76cd in malloc_consolidate () from /lib/tls/libc.so.6

иногда

Program received signal SIGSEGV, Segmentation fault.
0x009c7225 in _int_free () from /lib/tls/libc.so.6

Может ли так быть, что проблема не в программе, а в библиотеке, что используется программой?

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

anonymous
()
Ответ на: комментарий от anonymous

Зачем тебе отладчик друг мой ?
Ты выделил память под указатель в структуре ?
'my_massive[j].ch'  ?
Что ты делает функция g_strdup() ?  
'strdup' - понятно.  
Перед удалением указателя на структуру,
нужно удалить памать выделенную под указатель 
'my_massive[j].ch'   
free(my_massive[j].ch);  и это для всех [j] - конечно.

anonymous
()
Ответ на: комментарий от anonymous

g_strdup - функция из библиотеки glib.
Память под каждый указатель я освобождаю в блоке 
/* ... skipped ... */ (извиняюсь что не предупредил),
правда функцией g_free(my_massive[j].ch) (из
той же библиотеки).
Кстати, а если бы даже не освобождал, могло бы
это стать причиной ошибки? По-моему нет, это
всего лишь утечка памяти.


Опытным путем определил что ошибка кроется не в
приведенном коде, а в другом, в котором нет явных
операций с памятью (выделение-освобождение).
А почему же ошибки связаны именно с памятью?

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