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

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

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

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

Сообщение CRobin » 13.03.2017 18:43:40

Здравствуйте. В очередной раз испытываю проблемы метафизического характера. Поведение приложения меняется в зависимости от порядка полей в типах данных определяемых как record. Так же проблемы могут появляться и исчезать в зависимости от длинны полей внутри структуры.
Например:

работает
Код: Выделить всё
  TDescription= record
    weight: Uint32;
    qty : Uint32;
    fresh : Uint64;
  end;   


вызывает сбой в произвольном месте потока
Код: Выделить всё
  TDescription= record
    weight: Uint64;
    qty : Uint32;
    fresh : Uint64;
  end;   


Я примерно догадываюсь где кроется проблема, но не могу понять что конкретно я делаю не так. Видимо есть какие то правила, которых следует придерживаться при объявлении структур типа record. Возможно есть какие то условия кратности, которые я не выполняю. Где это можно выяснить доподлинно? В логике приложения ошибок нет, SIGSEGV возникает только в зависимости от способа размещения данных в памяти.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

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

Сообщение Дож » 13.03.2017 18:47:28

Ошибка в 17ой строке.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение CRobin » 13.03.2017 18:55:02

Дож, что вы имеете в виду?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

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

Сообщение zub » 13.03.2017 18:59:17

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

Гляди внимательно 17 строку!
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение CRobin » 13.03.2017 19:04:04

Вы это имеете в виду?
Код: Выделить всё
RequireDerivedFormResource := True;
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

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

Сообщение zub » 13.03.2017 19:08:51

))
Про 17 строку говорят когда приходится ванговать
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение CRobin » 13.03.2017 19:15:20

zub я на сто процентов уверен, что дело в компиляторе и в алгоритме выравнивания, просто я чего то не знаю об этом, чего то важного.
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

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

Сообщение zub » 13.03.2017 19:17:20

А мы тут на форуме вообще ничего незнаем что у тебя там. вот и грешим на 17 строку. Надо побольше информации
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 13.03.2017 19:21:22

CRobin писал(а):Вы это имеете в виду?

На самом деле они оба проверяют теорию вероятности. Дож математик и высчитал вероятность 17-й строки, строго по формулам вероятности. Соответственно, этим формулам существует вероятность, что когда нибудь у кого-то окажется ошибка именно на 17-й строке. И он так Вангует эту теорию.

С другой стороны, должен Вас уверить, что в коде который Вы привели ошибки нет. Потому что ошибка очень хорошо просматривается вот в этой Вашей фразе:
CRobin писал(а):В логике приложения ошибок нет, SIGSEGV возникает только в зависимости от

Соответственно, прописываю Вам новую директиву: Как только Вы хотите написать эту фразу, то тут же вспоминайте про 17-ю строку и приводите на форум весь код. И Вам докажут что ошибка кроется, именно в фразе: "В логике приложения ошибок нет"...
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение CRobin » 13.03.2017 19:50:17

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

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

Сообщение vitaly_l » 13.03.2017 20:00:08

CRobin писал(а):Если вы джентльмен, то должны поверить мне

Это ещё одна ошибочная директива. Здесь никто на слово Вам не поверит. Потому что, даже если такая ошибка действительно существует, то в коде программы, есть какая-то зависимость, которая детерминирует эту ошибку. Чудес не бывает. Дайте код, его разберут здесь на запчасти. Наговорят Вам кучу обидных слов, но в итоге обучат правильному. Они только внешне злые, а внутри они ещё ужаснее и коварнее. Так что давайте код и молитесь!
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение Лекс Айрин » 13.03.2017 20:04:58

CRobin писал(а):но способа решения найти не удалось.


Вроде как выравнивание переменных по границам определенных блоков (разных для разного процессора) должно помочь. На уровне исходного текста это группировка однотипных переменных.

CRobin писал(а):Где это можно выяснить доподлинно?


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

Добавлено спустя 1 минуту 39 секунд:
ах да... сначала советуют описывать переменные большего размера, а потом меньшего.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение CRobin » 13.03.2017 20:09:28

Лекс Айрин есть ли понимание, каких правил следует придерживаться для того чтоб упростить жизнь процессору в этом отношении?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

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

Сообщение zub » 13.03.2017 20:46:29

Есть понимание того что вопросы стоит подкреплять кодом. иначе строка 17.
По вашему описанию - у вас баги - займитесь отладкой!
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Лекс Айрин » 13.03.2017 20:50:51

CRobin,я, вроде, основные правила описал. Оптимизатор компилятора должен учитывать эти нюансы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

След.

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

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

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

Рейтинг@Mail.ru