ситуация типичная: пишется программа. как всегда SIGSEGV, но, вот показан кусок работы в gdb:
Breakpoint 2, template_procced (
str_start=0x8051f10 "Nov 10 16:46:11 proxima kernel: ipfw: 3100 Deny UDP 172.16.200.1:53 172.16.211.7:50105 in via rl0",
templ_start=0x8051ea8 "month date time host kernel/last prog/mess id/repeat
target/count proto/times src dst in via dev") at firewall.c:181
181 first_templ_word = (char *)get_before_slash(templ_word);
(gdb) s
get_before_slash (word=0x8051e78 "date") at string.c:226
226 char * result = NULL;
...
here goes code
...
260 if (find_slash == 0) {
(gdb)
261 result = (char *)safe_strdup(word);
(gdb) p word
$14 = 0x8051e78 "date"
(gdb) p calloc(5,1)
$15 = (void *) 0x8051e88
(gdb) p free(0x8051e88)
$16 = void
(gdb) s
safe_strdup (str=0x8051e78 "date") at string.c:355
355 char * result = NULL;
(gdb)
(gdb) p calloc(5,1)
Program received signal SIGSEGV, Segmentation fault.
0x400944c8 in _int_malloc () from /lib/libc.so.6
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on"
Evaluation of the expression containing the function (calloc) will be abandoned.(gdb)
Сразу говорю, что вместо "(gdb) p calloc(5,1)" в проге стоит нормальное выделение памяти. тоже самое касаеться (gdb) p free(0x8051e88).
описание: до входа в функцию память освобождалась и выделялась нормально (пробовал много раз), но после - вы сами видете. В чем может быть причина этого ? я понимаю что это мой код что-то делает не так, но почему именно в такой форме все происходит ?
И еще один прикол из той же програмы:
Breakpoint 2, template_procced (
str_start=0x8051f10 "Nov 10 16:46:11 proxima kernel: ipfw: 3100 Deny UDP 172.16.200.1:53 172.16.211.7:50105 in via rl0",
templ_start=0x8051ea8 "month date time host kernel/last prog/mess id/repeat
target/count proto/times src dst in via dev") at firewall.c:181
181 first_templ_word = (char *)get_before_slash(templ_word);
(gdb) s
get_before_slash (word=0x8051e78 "date") at string.c:226
226 char * result = NULL;
(gdb) p word
$7 = 0x8051e78 "date"
(gdb) p calloc(5,1)
$8 = (void *) 0x8051e78
(gdb) p word
$9 = 0x8051e78 ""
(gdb) p free(0x8051e78)
$10 = void
(gdb) p word
$11 = 0x8051e78 "date"
описание: я выделяю память. Она выделяеться на уже выделеном участке (это первый глюк). calloc должен этот участок очистить. Но после освобождения памяти, прежние данные тоже остаються в порядке (второй).
ну просто пиздец какой-то.
Я не прошу писать мне сообщения типа: это у тебя ошибка в проге. Я это знаю.
Мне интересен другой вопрос, как calloc смог выделить память, очистить ее, а потом вернуть ее старое сдержимое на место. Или это gdb прикалывается, или это calloc не смог правильно сработать.


Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум SIGSEGV (2010)
- Форум SIGSEGV (2010)
- Форум Qt sigsegv (2014)
- Форум Источник SIGSEGV (2006)
- Форум __int_malloc - SIGSEGV (2004)
- Форум SIGSEGV, предположительно glibc (2011)
- Форум [C++]Причины SIGSEGV (2011)
- Форум Перезапуск при SIGSEGV (2014)
- Форум lazarus, ООП, sigsegv (2014)
- Форум [java][idea] SIGSEGV (2012)