Ошибка сегментации.

Модератор: Модераторы разделов

Аватара пользователя
Janik
Сообщения: 870
Статус: Оператор вычислительных машин
ОС: Debian

Ошибка сегментации.

Сообщение Janik »

Написал свой игровой движок, скомпилировал, запустил и сразу же вылетает segfault.
Ниже вывод gdb:

Код: Выделить всё

GNU gdb (GDB) 7.1-debian
Copyright © 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/user/miaj_proektoj/pyramide/Pyramid_engine...done.
(gdb) r
Starting program: /home/user/miaj_proektoj/pyramide/Pyramid_engine
[Thread debugging using libthread_db enabled]

Program received signal SIGSEGV, Segmentation fault.
rawmemchr () at ../sysdeps/i386/rawmemchr.S:70
70    ../sysdeps/i386/rawmemchr.S: Нет такого файла или каталога.
    in ../sysdeps/i386/rawmemchr.S

По моему, дело в функции rawmemchr.
Исходники движка прилагаются.
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Ошибка сегментации.

Сообщение watashiwa_daredeska »

Хоть бы локализовали ошибку-то... Всякие там mem*, str* и пр. Вполне могут давать SIGSEGV, если им фигню на вход подсунуть. Да и много чего ещё может быть.

P.S. Вкладывать *~ в архив — моветон.
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 870
Статус: Оператор вычислительных машин
ОС: Debian

Re: Ошибка сегментации.

Сообщение Janik »

watashiwa_darede... писал(а):
11.04.2010 17:05
P.S. Вкладывать *~ в архив — моветон.

Что-то не обратил внимания...Пофиксено.
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Ошибка сегментации.

Сообщение watashiwa_daredeska »

После SIGSEGV в gdb сделайте bt, проследите стек до своего исходника и проверьте входные параметры того, что вызываете.
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 870
Статус: Оператор вычислительных машин
ОС: Debian

Re: Ошибка сегментации.

Сообщение Janik »

Вот, вывод команды bt.

Код: Выделить всё

#0  rawmemchr () at ../sysdeps/i386/rawmemchr.S:70
#1  0xb7becf5b in _IO_str_init_static_internal (sf=0xbffff3d8,
    ptr=0x65646956 <Address 0x65646956 out of bounds>, size=0, pstart=0x0)
    at strops.c:45
#2  0xb7be08d3 in _IO_vsscanf (
    string=0x65646956 <Address 0x65646956 out of bounds>,
    format=0x804bc69 "Video %dx%d;",
    args=0xbffff4a8 "\340\324\004\b\344\324\004\b") at iovsscanf.c:44
#3  0xb7bd04cb in __sscanf (s=0x65646956 <Address 0x65646956 out of bounds>,
    format=0x804bc69 "Video %dx%d;") at sscanf.c:34
#4  0x0804932f in Read_config () at files.cpp:56
#5  0x70656420 in ?? ()
#6  0x33206874 in ?? ()
#7  0x530a3b32 in ?? ()
#8  0x76205846 in ?? ()
#9  0x6d756c6f in ?? ()
#10 0x35322065 in ?? ()
#11 0x4d0a3b35 in ?? ()
#12 0x63697375 in ?? ()
#13 0x6c6f7620 in ?? ()
#14 0x20656d75 in ?? ()
#15 0x3b353532 in ?? ()
#16 0x6265440a in ?? ()
---Type <return> to continue, or q <return> to quit---
#17 0x31206775 in ?? ()
#18 0x614d0a3b in ?? ()
#19 0x64207370 in ?? ()
#20 0x63657269 in ?? ()
#21 0x79726f74 in ?? ()
#22 0x70616d20 in ?? ()
#23 0x0a3b2f73 in ?? ()
#24 0x69726353 in ?? ()
#25 0x20737470 in ?? ()
#26 0x65726964 in ?? ()
#27 0x726f7463 in ?? ()
#28 0x63732079 in ?? ()
#29 0x74706972 in ?? ()
#30 0x0a3b2f73 in ?? ()
#31 0x6e756f53 in ?? ()
#32 0x64207364 in ?? ()
#33 0x63657269 in ?? ()
#34 0x79726f74 in ?? ()
#35 0x756f7320 in ?? ()
#36 0x2f73646e in ?? ()
#37 0x754d0a3b in ?? ()
#38 0x20636973 in ?? ()
#39 0x65726964 in ?? ()
---Type <return> to continue, or q <return> to quit---
#40 0x726f7463 in ?? ()
#41 0x756d2079 in ?? ()
#42 0x2f636973 in ?? ()
#43 0x65540a3b in ?? ()
#44 0x72757478 in ?? ()
#45 0x64207365 in ?? ()
#46 0x63657269 in ?? ()
#47 0x79726f74 in ?? ()
#48 0x78657420 in ?? ()
#49 0x65727574 in ?? ()
#50 0x0a3b2f73 in ?? ()
#51 0x73646f4d in ?? ()
#52 0x72696420 in ?? ()
#53 0x6f746365 in ?? ()
#54 0x6d207972 in ?? ()
#55 0x2f73646f in ?? ()
#56 0xbfff0a3b in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)


Похоже, уходит за пределы адресного пространства.
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Ошибка сегментации.

Сообщение watashiwa_daredeska »

Ошибка в Read_config в files.cpp
Исходники ужасны. files.cpp ссылается на переменные, которые в нём не задекларированы (include'ов с декларациями в нём вообще нет). Мне даже лень смотреть, выделяется ли где-нибудь память для MAP_DIR, SCRIPT_DIR и пр., в которые sscanf складыват данные.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Ошибка сегментации.

Сообщение NickLion »

Здесь:

Код: Выделить всё

fread(&config, sizeof(char), 3000, fp);

Может:

Код: Выделить всё

fread(config, sizeof(char), 3000, fp);

?

PS ну, а так, да, код не очень… К тому же ещё будут проблемы далее по коду с sscanf'ами.
PPS оставлять бинарники в архиве - тоже нехорошо. Во-первых на другой машине они могут просто не запуститься, во-вторых размер лишний, в-третьих, а вдруг у Вас вирусы? ;)
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 870
Статус: Оператор вычислительных машин
ОС: Debian

Re: Ошибка сегментации.

Сообщение Janik »

Переписал немного функию Read_config(). Движок запустился в дебаггере, а просто так если запустить, то вылетает "Исключение в операции с плавающей точкой"

Код: Выделить всё

int Read_config()
{
char * config[400];
FILE * fp;

if((fp=fopen("config.ini", "rb"))==NULL)
    {
    printf("Не найден конфигурационный файл!\n");
    exit(1);
    }

fread(&config, sizeof(char), 400, fp);
int i;
for( i=0; i<400, i++;)
    {
    sscanf(config[i], "Width %d;", &Width);
    sscanf(config[i], "Height %d;", &Height);
    sscanf(config[i], "Color depth %d;", &Color_depth);
    sscanf(config[i], "SFX volume %d;", &SFX_volume);
    sscanf(config[i], "Music volume %d;", &Music_volume);
    sscanf(config[i], "Debug %d;", &debug);
    sscanf(config[i], "Maps directory %s;", &MAP_DIR);
    sscanf(config[i], "Scripts directory %s;", &SCRIPTS_DIR);
    sscanf(config[i], "Textures directory %s;", &TEXTURES_DIR);
    sscanf(config[i], "Mods directory %s;", &MODS_DIR);
    sscanf(config[i], "Music directory %s;", &MUSIC_DIR);
    sscanf(config[i], "Sounds directory %s;", &SOUNDS_DIR);
    }

return 0;
}
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Ошибка сегментации.

Сообщение NickLion »

а под config[i] кто память выделять будет?

PS ой-ой-ой... у Вас там тоже неправильно...
fread(&config, sizeof(char), 400, fp); - и что это? 400 байт в никуда?

PPS почему не читать из файла fscanf'ом? в чём профит сначала fread, а затем sscanf?
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 870
Статус: Оператор вычислительных машин
ОС: Debian

Re: Ошибка сегментации.

Сообщение Janik »

Пофиксил "Исключение в операции с плавающей точкой". Просто заменил тип переменной. Теперь вылетает правильно (то есть завершается корректно). :)
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Ошибка сегментации.

Сообщение watashiwa_daredeska »

Ужас кошмарный.

1. Пытаемся прочитать 400 символов конфига. (почему 400?)
2. Начиная с каждого символа парсим 12 переменных (всех, по очереди, начиная с одного и того же символа).

А про выделение памяти, судя по всему, мои слова были проигнорированы.
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 870
Статус: Оператор вычислительных машин
ОС: Debian

Re: Ошибка сегментации.

Сообщение Janik »

NickLion писал(а):
11.04.2010 20:16
а под config[i] кто память выделять будет?

Уже выделено.

Код: Выделить всё

char * config[400];


watashiwa_darede... писал(а):
11.04.2010 20:19
(почему 400?)

Много параметров пока не будет.
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Ошибка сегментации.

Сообщение NickLion »

Janik писал(а):
11.04.2010 20:30
NickLion писал(а):
11.04.2010 20:16
а под config[i] кто память выделять будет?

Уже выделено.

Код: Выделить всё

char * config[400];


Вы не понимаете, что пишете. Вы создали массив из 400 указателей на символ. config[i] - это указатель на символ. А сами указатели куда ведут? в никуда.
&config это то же самое, что и config[0], т.е. указатель, ведущий в никуда. И вот туда Вы и считываете строку из файла. 400 байт.
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 870
Статус: Оператор вычислительных машин
ОС: Debian

Re: Ошибка сегментации.

Сообщение Janik »

Ну спасибо всем кто ответил и покритиковал. Тему можно закрыть (или удалить?).
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали: