Проблемы сегментации памяти с типами record

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Проблемы сегментации памяти с типами record

Сообщение Pavia » 13.03.2017 21:18:05

Всё просто у вас ошибка с указателями. Вы куда-то не туда пишете или не то. Найти такие ошибки очень трудно. Я год искал такую! То появлялось то исчезала при этом при попытке локализовать всякий раз появлялась в разных местах.
По мимо указателей следует проверить выход за приделы массива. Обычно тут помогает статистический анализ читайте и исправляйте все wornings. А потом прогоните сторонней тулзой.
Обычно либо забыли "-1" либо где-то лишняя.
Далее пункт два - это дихотомия. Начинаете отключать части программ смотрите исчезает ошибка или появляется. Если отключили верхнюю часть и ошибка исчезла, то ошибка в верхней половине. Если ошибка не исчезла отключаем нижнюю половину программы. Далее берём, ту половину в которой ошибка и её условно делам пополам и снова отключаем половины.
Если не помогло или не получилось переходим к стадии три рефакторингу. Смотрим какие функции сложные:
если функция длине 20 строк то она кандидат на упрощение. Каждое условие надо постараться вынести в отдельную функцию. Циклы тоже в отдельную функцию. Вложенные циклы можно не разбивать если их не более 2-х. Если более 2-х то разбиваем. Пролог, эпилог сократить до 1 строчки.
Простые функции проще проверить и отбросить. Конечный автомат стоит оформить одной функцией, а не разбрасывать по всему коду. Если очень сложный то оформить отдельным модулем.

Как не запутаться в именах? Надо правильно именовать функции как описано у МакКонала в книге «Совершенный код».
После рефакторинга, переходим к следующей стадии добавляем проверки данных по входу.
Если проверка данных по входу не помогает делаем ещё проверку по выходу. Для этого поможет журналирование(logging). Проверяем как свой код так и сторонний в том числе и API.

Следующий этап это фазинг. Фазинг тесно связан с журналированием(logging). Суть фазинга не генерировать такие вектора данных что-бы тест смог заглянуть во-все ветки функций. А журналирование помогает зафиксировать тот вектор на котором программа падает. Так вот я год искал ошибку потому что в одном из условий забыл дописать расчёт указателя функция генерировала мусор и отчасти затирала чужие данные. А в эту функцию программа заходило редка. И проблема была в том что ошибка всплывала не сразу а ещё через миллион процессорных циклов когда шло обращение к данным.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: Проблемы сегментации памяти с типами record

Сообщение CRobin » 14.03.2017 00:54:03

Pavia похожий цикл отладки я проходил не однократно. Не смотря на скепсис постояльцев, я ответственно заявляю, что в сабже темы к рассмотрению предложен не этот случай. Если будет время, а оно скорее всего будет, я предложу конкретный исходный код, демонстрирующий ошибку в зависимости от порядка полей в структуре record. Ошибка сегментации при этом будет возникать при вызове функции fillchar или fillbyte.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Проблемы сегментации памяти с типами record

Сообщение zub » 14.03.2017 00:56:55

Чудес не бывает. с record в компиляторе давным давно всё устаканено. Подождем код
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Проблемы сегментации памяти с типами record

Сообщение pupsik » 14.03.2017 01:15:52

Чисто теоретически. Если обращаться не по правилам. Т.е. не совпадают типы данных. Т.е. вы пытаетесь работать с QWord, а там LongWord "сидит" и SIGSEGV "крутит"?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Проблемы сегментации памяти с типами record

Сообщение vitaly_l » 14.03.2017 10:37:03

CRobin писал(а):я ответственно заявляю ... Ошибка сегментации при этом будет возникать при вызове функции fillchar или fillbyte.

Ага... это явно - не переполнение кэша процессора.

И SIGSEGV вылетающая между вызовами pop, в стеке процессора - честно говоря вызывает адекватное сомнение.Процессор - не может так часто проверять (между командами pop при захвате каждой переменной из стека), т.к. это слишком затратно и он бы кипел.

Вангировать бесполезно - вангинатор можно поломать.
Самый правильный вариант: сделать отдельный минимальный пример с ТАКИМ-ЖЕ рекордом и попробовать воспроизвести ошибку. Когда ошибку воспроизвести не удастся, то можно переходить к методам Pavia и заново штудировать весь код.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Проблемы сегментации памяти с типами record

Сообщение serbod » 14.03.2017 11:11:27

Достаточно отключить оптимизацию, включить все проверки (Range check, overflow check) и предупреждения компилятора. И переписать код так, чтобы компилятор не ругался.

Если record используется в операциях ввода-вывода, то как правило, это должен быть packed record.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Проблемы сегментации памяти с типами record

Сообщение Лекс Айрин » 14.03.2017 12:14:25

vitaly_l писал(а):Ага... это явно - не переполнение кэша процессора.


Вообще, переполнение само по себе не является ошибкой. И его, как такового, быть не может. Просто при необходимости из него выкидываются менее актуальные данные.
И не надо недооценивать кеш... у меня был случай, когда при его отключении программа тупо не ставилась.

vitaly_l писал(а):Процессор - не может так часто проверять (между командами pop при захвате каждой переменной из стека),


Ты будешь долго смеяться... именно, что он проверяет все при каждой операции. И не один раз. Аппаратно. Любой чих вызывает прерывание. Часть обрабатывается в самом проце, а часть требует доступа к внешним устройствам (памяти).
vitaly_l писал(а):и он бы кипел.


Как бы без кулера комп еще на первых пнях долго не работает... И даже при этом, у меня периодически выгорал южный мост. На некоторых моделях оперативки стоят радиаторы охлаждения... и после этого он не кипит?

Я не настаиваю, что моя причина верная... но ее как раз проверить проще всего. А да, в современных компиляторах подобных ошибок возникать не должно.

Добавлено спустя 9 минут 16 секунд:
возможно, стоит поиграть с опцией компилятора -CPPACKRECORD= (варианты 1, 2, 4, 8, 16, 32) ну или тупо выставить другую модель процессора.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Проблемы сегментации памяти с типами record

Сообщение pupsik » 14.03.2017 15:49:56

Вспомнил что "напрягло": а дебагер в лазаре уже и потоки адекватно воспринимает? А то чёт у меня он, иногда, SIGSEGV довольствуется, а иной раз, только пятой точкой, или по методу Pavia.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Проблемы сегментации памяти с типами record

Сообщение Cheb » 15.03.2017 11:56:47

Если record используется в операциях ввода-вывода, то как правило, это должен быть packed record.

Если сохраняешь данные на диск или обмениваешься с внешней DLL / API - изучи {$packrecords и {$optimization noorderfields} , без этого успеха тебе не видать.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Проблемы сегментации памяти с типами record

Сообщение MiniQ » 15.03.2017 13:52:39

В самом деле, не имея понимания, что ты там делаешь, сложно давать советы.
Но можешь попробовать использвать packed record
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru
cron