ARM после загрузки GLES деление двух целых даёт AV

Общие вопросы программирования, алгоритмы и т.п.

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

ARM после загрузки GLES деление двух целых даёт AV

Сообщение Cheb » 21.04.2017 23:10:34

Код: Выделить всё
          then with Mother^.Display.WindowRect do try
addlog('>>-------------');
addlog(' %0',[300 / 500]);
addlog(' %0', [RectToStr(Mother^.Display.WindowRect)]);
addlog(' %0, %1', [width, height]);
addlog(' %0', [RectToStr(Mother^.Display.ScreenRect)]);
addlog(' %0, %1', [Mother^.Display.ScreenRect.width, Mother^.Display.ScreenRect.height]);
addlog(' %0',[width / Mother^.Display.ScreenRect.Width]);
addlog(floattostr(1.0 * width / 1.0 * Mother^.Display.ScreenRect.Width));
            Config.Str['video','window_width']:= floattostr(1.0 * width / Mother^.Display.ScreenRect.Width);
//            Config.Float['video', 'window_height']:= height / Mother^.Display.ScreenRect.height;
//            Config.Float['video', 'window_left']:= (left - Mother^.Display.ScreenRect.left) / Mother^.Display.ScreenRect.width;
//            Config.Float['video', 'window_top']:= (top - Mother^.Display.ScreenRect.top) / Mother^.Display.ScreenRect.height;
addlog('<<');
          except

даёт
Код: Выделить всё
[frame #2, 19:03:38.174, Fri, 21.04.2017]
>>-------------
0.6
1152x648(556,405)
1152, 648
1920x1080(0,0)
1920, 1080
<----=* ERROR! ---- (look below for details) *=---->
<----=* ERROR! ---- (look below for details) *=---->
There were unprocessed error messages left:
!!..
Program crashed with an uncaught exception.
EAccessViolation: Access violation
  :773 in chentrah-armv7l
:
  framework_basic.pp:637 (tbasicframework.checkwindowsize)  in chentrah-armv7l
Call stack:
  framework_basic.pp:590 (tbasicframework.checkwindowsize)  in chentrah-armv7l


Что это было, Пух? :(
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: ARM после загрузки GLES деление двух целых даёт AV

Сообщение olegy123 » 22.04.2017 12:39:43

Это нормально...
Видимо Mother^.Display.ScreenRect.Width указывает хрен знает на что..

Добавлено спустя 3 минуты 3 секунды:
Такое бывает если у вас течет память.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: ARM после загрузки GLES деление двух целых даёт AV

Сообщение Cheb » 22.04.2017 12:49:55

Автором этого сообщения является olegy123, находящийся в вашем чёрном списке.

Кто-нибудь, НЕ являющийся резидентным троллем, знает ответ? Anybody? みんな?
А-у... :(
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: ARM после загрузки GLES деление двух целых даёт AV

Сообщение olegy123 » 22.04.2017 13:44:07

Ответ прошаренного троолля который в прошлом нахватал таких ошибок особенно под Сишными либлами.. Когда даже в гарантированной переменной у тебя вдруг откуда то возникает куча мусора..
Источниками таких ошибок может быть не правильно написанный код в других местах, либо ошибки выделения памяти или кривая работа с указателями..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: ARM после загрузки GLES деление двух целых даёт AV

Сообщение Cheb » 22.04.2017 13:46:39

Автором этого сообщения является olegy123, находящийся в вашем чёрном списке.

Bump.
Прошу прощения за флуд.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: ARM после загрузки GLES деление двух целых даёт AV

Сообщение Sergei I. Gorelkin » 22.04.2017 13:50:14

Вот без понятия, что там происходит. Но:
1) самое первое "проверочное" деление на самом деле не выполняется, т.к. константное выражение вычисляется компилятором.
2) На ARM ошибки операций с плавающей запятой могут не вызывать исключений. А могут и вызывать, в зависимости от реализации процессора.
3) RTL устроена по принципу "в любой непонятной ситуации говори, что это AV", поэтому нужно брать отладчик и смотреть, что происходит на уровне ассемблера.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: ARM после загрузки GLES деление двух целых даёт AV

Сообщение Cheb » 22.04.2017 14:56:52

"проверочное" деление на самом деле не выполняется

Аз есмь дятел :oops:

ошибки операций с плавающей запятой могут не вызывать исключений. А могут и вызывать

Проблема в том что выше я вывожу оба и делитель и делимое, это longint'ы и делитель = 1920.
Т.е. делением на ноль это *не* может быть.

Единственное, что приходит на ум - GLES драйвер видеоядра при инициализации вздрючил флаги исключений fpu (или их армовского аналога).
Я даже пытался курить исходники SafeLoadLibrary(), но там только для интела :(

RTL устроена по принципу "в любой непонятной ситуации говори, что это AV",

Ага. Интересно, не знал.

брать отладчик и смотреть, что происходит на уровне ассемблера.

[тяжкий вздохЪ]

Добавлено спустя 12 минут 43 секунды:
P.S. Не-а. Это генератор кода в компиляторе каким-то образом обосрался.
Код: Выделить всё
var gvl1, gvl2: longint;
...
gvl1:= width;
gvl2:= Mother^.Display.ScreenRect.Width;
addlog(' %0',[gvl1 / gvl2]); //всё пучком
addlog(' %0',[width / Mother^.Display.ScreenRect.Width]); //бомбит


Добавлено спустя 32 минуты 1 секунду:
..интересно, добавил
addlog(' %0 %1',[@width, @Mother^.Display.ScreenRect.Width]);
- получил 76B952D6h 76B952B6h, т.е. адреса НЕ выровнены.

Откуда: эти сраные библиотеки перекинули какой-то флажок бомбить на невыровненных флоатах.

Модифицировал хидер, вставил {$ifdef cpuarm}{$packrecords 4}{$endif}, заменил все packed record на {$ifndef cpuarm}packed{$endif} record - и всё пошло :D

Код: Выделить всё
>>-------------
0.6
1152x648(556,405)
1152, 648
1920x1080(0,0)
1920, 1080
0.6
76B6E2D8h 76B6E2B8h
0.6
2211840
<<


при
Код: Выделить всё
          then with Mother^.Display.WindowRect do try
addlog('>>-------------');
gvl1:= 300; gvl2:= 500;
addlog(' %0',[gvl1 / gvl2]);
addlog(' %0', [RectToStr(Mother^.Display.WindowRect)]);
addlog(' %0, %1', [width, height]);
addlog(' %0', [RectToStr(Mother^.Display.ScreenRect)]);
addlog(' %0, %1', [Mother^.Display.ScreenRect.width, Mother^.Display.ScreenRect.height]);
gvl1:= width;
gvl2:= Mother^.Display.ScreenRect.Width;
addlog(' %0',[gvl1 / gvl2]);
addlog(' %0 %1',[@width, @Mother^.Display.ScreenRect.Width]);
addlog(' %0',[width / Mother^.Display.ScreenRect.Width]);
addlog(floattostr(1.0 * width / 1.0 * Mother^.Display.ScreenRect.Width));
            Config.Str['video','window_width']:= floattostr(1.0 * width / Mother^.Display.ScreenRect.Width);
//            Config.Float['video', 'window_height']:= height / Mother^.Display.ScreenRect.height;
//            Config.Float['video', 'window_left']:= (left - Mother^.Display.ScreenRect.left) / Mother^.Display.ScreenRect.width;
//            Config.Float['video', 'window_top']:= (top - Mother^.Display.ScreenRect.top) / Mother^.Display.ScreenRect.height;
addlog('<<');
          except


Вот же, мать же его же, же, а? :evil:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: ARM после загрузки GLES деление двух целых даёт AV

Сообщение Sergei I. Gorelkin » 22.04.2017 16:11:06

Хм... так до загрузки GLES операции с плавающей запятой на невыровненных данных не бомбили или просто не выполнялись?
В моем представлении, выравнивание на ARM - это такая аксиома, что мысль о упакованной структуре не то чтобы в голову не пришла, а даже мимо не пролетела.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: ARM после загрузки GLES деление двух целых даёт AV

Сообщение runewalsh » 22.04.2017 16:43:34

Packed это оче плохо, если не знаешь, что делаешь! Даже на x86, не выплёвывающем ошибки выравнивания наружу, например, interlocked-операции с невыровненными значениями тихо выполнятся не атомарно.

Но странно, что это произошло при http://www.freepascal.org/docs-html/ref/refse82.html:
>the compiler assumes that access to all fields/elements of packed data structures is unaligned.
В таком случае похоже на баг.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: ARM после загрузки GLES деление двух целых даёт AV

Сообщение Cheb » 22.04.2017 18:45:09

не бомбили или просто не выполнялись?

не бомбили, специальный тест написал.
И выполнялись ОК.
Видать, седьмой арм настолько могучий.

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

А вот ить работали. Пока не...

тихо выполнятся не атомарно.

Изображение

..но если серьёзно - все эти записи представляют собой интерфейс между маткой и DLL, заполняются один раз на старте и изменяются чуть чаще, чем никогда (в подавляющем большинстве случаев - в основном потоке)
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: ARM после загрузки GLES деление двух целых даёт AV

Сообщение olegy123 » 23.04.2017 13:47:46

Sergei I. Gorelkin писал(а):) RTL устроена по принципу "в любой непонятной ситуации говори, что это AV", поэтому нужно брать отладчик и смотреть, что происходит на уровне ассемблера.

Access violation - по моему опыту это "выход за предел допустимого". Что может сказать система если вы пишите в область ReadOnly или выходите за рамки своих областей или вообще указываете на несуществующую область.. Эта ошибка очень характерна с работой указателей..
Но если вы пишите в допустимую область, даже в чужие переменные - то ошибок не возникает, в этом проблема указателей..
Только ревизия всего кода может выявить проблему.

Если дело не в packed record и в выравнивании данных, я не буду оспаривать.. то у этого поциента еще в будущем будут чудные открытия в самых неожиданных местах..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20


Вернуться в Общее

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

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

Рейтинг@Mail.ru