Странный баг Delphi XE8
От: Khimik  
Дата: 25.08.23 07:22
Оценка:
Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.
Вернул предыдущий код проекта — снова всё работает. Попытался подменить часть модулей последним кодом — снова перестало работать. После этого вернул эти же модули предыдущими — снова не работает; но если обновить все коды проекта, снова вернуть предыдущий вариант — работает.
Попробовал установить Delphi на другом компьютере, скомпилировал — такая же ошибка.
Заметил ещё одну странность: на одном из модулей (возможно это как раз проблемный модуль, с которого всё пошло) после нажатия F9 возникает синий breakpoint на самой верхней строчке (где название модуля). Убираю этот breakpoint, нажимаю F9 — снова он появляется.
Кто-нибудь с таким сталкивался?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Странный баг Delphi XE8
От: Khimik  
Дата: 25.08.23 07:56
Оценка:
Выяснилось, что если выбрать Target platform / Windows 32 и скомпилировать, то запускается нормально. Если же снова выбрать Windows 64, далее Clean, Build, Compile, то опять эта ошибка. Прошу помочь.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Странный баг Delphi XE8
От: rudzuk  
Дата: 25.08.23 08:56
Оценка:
Здравствуйте, Khimik, Вы писали:

K> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.


Код-то покажешь?
avalon/3.0.2
Re[2]: Странный баг Delphi XE8
От: Khimik  
Дата: 25.08.23 09:16
Оценка:
Здравствуйте, rudzuk, Вы писали:

K>> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.


R>Код-то покажешь?


Какой смысл? Код то нормальный, в Win32 версии всё запускается. Сообщение об ошибке возникает там где всё чисто. А весь код я же не могу показать.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[3]: Странный баг Delphi XE8
От: rudzuk  
Дата: 25.08.23 09:24
Оценка: 4 (2) +4 :)
Здравствуйте, Khimik, Вы писали:

K> K>> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.


K> R>Код-то покажешь?


K> Какой смысл? Код то нормальный, в Win32 версии всё запускается. Сообщение об ошибке возникает там где всё чисто. А весь код я же не могу показать.


Ну ладно. Тогда сходи к гадалке, она в хрустальный шар посмотрит.
avalon/3.0.2
Re[3]: Странный баг Delphi XE8
От: swame  
Дата: 25.08.23 20:50
Оценка: +1
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, rudzuk, Вы писали:


K>>> Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.


R>>Код-то покажешь?


K>Какой смысл? Код то нормальный, в Win32 версии всё запускается. Сообщение об ошибке возникает там где всё чисто. А весь код я же не могу показать.


То что в Win32 оно работает, не доказывает что нет ошибок.
Помню при переходах на новые версии Windows в программах обнаруживалиcь баги работы с памятью,
которые на более ранних версиях Windows не проявлялись исчезающе редко, а начинали проявляться из за более строго контроля памяти при обновлении Windows.
Возможно ошибки работы с памятью, при это м ошибка может быть совсем в другом месте, чем выпадает в дебаггере.
У тебя же накручено каких-то велосипедов работы с объектами.
Частая ошибка такого рода неправильно приведении типов черех скобочки а не оператор as. Неправильное приведение типов переменных (особенно уучитывая 64 разрядную версию).
Я бы в перую очередь прогнал программу с FAstMM c включенной опцией CherckHeapForCorruption, начиная с 32 разрядного режима
Узнаешь много удивительного о качестве своей программы

K>Заметил ещё одну странность: на одном из модулей (возможно это как раз проблемный модуль, с которого всё пошло) после нажатия F9 возникает синий breakpoint на самой верхней строчке (где название модуля). Убираю этот breakpoint, нажимаю F9 — снова он появляется.


У меня тоже бывает незванный breakpoint, на первой строке проекта, не знаю отчего это. НО с предыдущим багом вряд ли связан.
Отредактировано 25.08.2023 21:00 swame . Предыдущая версия . Еще …
Отредактировано 25.08.2023 20:58 swame . Предыдущая версия .
Re[4]: Странный баг Delphi XE8
От: Khimik  
Дата: 28.08.23 12:39
Оценка:
Здравствуйте, swame, Вы писали:

S>Я бы в перую очередь прогнал программу с FAstMM c включенной опцией CherckHeapForCorruption, начиная с 32 разрядного режима

S>Узнаешь много удивительного о качестве своей программы

Поставил модуль FastMM, и не очень понятно пока что с ним делать дальше. Извиняюсь за ламерские вопросы, CheckHeapForCorruption это ведь не булева константа, там стоит
{.$define CheckHeapForCorruption}

Нужно убрать точку чтобы это включить? Я так сделал и не увидел изменений, может он куда-то пишет отчёт?
Я пока не знаю что значит $define
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[5]: Странный баг Delphi XE8
От: swame  
Дата: 28.08.23 18:45
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:


S>>Я бы в перую очередь прогнал программу с FAstMM c включенной опцией CherckHeapForCorruption, начиная с 32 разрядного режима

S>>Узнаешь много удивительного о качестве своей программы

K>Поставил модуль FastMM, и не очень понятно пока что с ним делать дальше. Извиняюсь за ламерские вопросы, CheckHeapForCorruption это ведь не булева константа, там стоит

K>{.$define CheckHeapForCorruption}

K>Нужно убрать точку чтобы это включить? Я так сделал и не увидел изменений, может он куда-то пишет отчёт?

K>Я пока не знаю что значит $define

Можно поставить приложение
https://sourceforge.net/projects/fastmm/
и настраивать конфиг визуально,


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

Вот ут что-то написано, но тут больше про утечки
https://www.gunsmoker.ru/2009/05/blog-post_24.html

https://www.gunsmoker.ru/2010/03/blog-post.html


И даже свежачок
https://www.gunsmoker.ru/2023/04/librariescomponentsarenottested.html

Мы кстати как альтернативу Эврики используем MadExcept http://madexcept.com
Отредактировано 28.08.2023 19:05 swame . Предыдущая версия . Еще …
Отредактировано 28.08.2023 19:00 swame . Предыдущая версия .
Отредактировано 28.08.2023 18:57 swame . Предыдущая версия .
Отредактировано 28.08.2023 18:50 swame . Предыдущая версия .
Отредактировано 28.08.2023 18:49 swame . Предыдущая версия .
Re: Странный баг Delphi XE8
От: BSOD  
Дата: 28.08.23 19:28
Оценка: :))
Здравствуйте, Khimik, Вы писали:

K>Убираю этот breakpoint, нажимаю F9 — снова он появляется.

Тут уместен анекдот с ключевой фразой "закопайте стюардессу".
Sine vilitate, sine malitiosa mente
Re[6]: Странный баг Delphi XE8
От: Khimik  
Дата: 29.08.23 07:26
Оценка:
Здравствуйте, swame, Вы писали:

S>Можно поставить приложение

S>https://sourceforge.net/projects/fastmm/
S>и настраивать конфиг визуально,

Не понял, какое приложение? По ссылке можно скачать FastMM4991.zip, там нет exe файлов.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Странный баг Delphi XE8
От: T4r4sB Россия  
Дата: 29.08.23 11:51
Оценка: +1
Здравствуйте, Khimik, Вы писали:

K>Я что-то поменял в коде, и мой проект перестал запускаться. Стала срабатывать ошибка range check error в коде, где такой ошибки не может быть.

K>Вернул предыдущий код проекта — снова всё работает. Попытался подменить часть модулей последним кодом — снова перестало работать. После этого вернул эти же модули предыдущими — снова не работает; но если обновить все коды проекта, снова вернуть предыдущий вариант — работает.
K>Попробовал установить Delphi на другом компьютере, скомпилировал — такая же ошибка.
K>Заметил ещё одну странность: на одном из модулей (возможно это как раз проблемный модуль, с которого всё пошло) после нажатия F9 возникает синий breakpoint на самой верхней строчке (где название модуля). Убираю этот breakpoint, нажимаю F9 — снова он появляется.
K>Кто-нибудь с таким сталкивался?

Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка
Re[7]: Странный баг Delphi XE8
От: swame  
Дата: 29.08.23 13:12
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:


S>>Можно поставить приложение

S>>https://sourceforge.net/projects/fastmm/
S>>и настраивать конфиг визуально,

K>Не понял, какое приложение? По ссылке можно скачать FastMM4991.zip, там нет exe файлов.


Перепутал, программа здесь

https://jedqc.blogspot.com/2007/07/new-fastmm4-options-interface.html

но ссылка сдохла, положил


https://disk.yandex.ru/d/k4mMp2MCe2c4sQ
Re[2]: Странный баг Delphi XE8
От: swame  
Дата: 29.08.23 14:30
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, Khimik, Вы писали:



TB>Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка


Компилятор D10, D11 выдает огшибку компиляции в таком случае. НАсчет XE8 не знаю
Re[3]: Странный баг Delphi XE8
От: rudzuk  
Дата: 29.08.23 17:23
Оценка:
Здравствуйте, swame, Вы писали:

s> TB>Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка


s> Компилятор D10, D11 выдает огшибку компиляции в таком случае. НАсчет XE8 не знаю


Не выдает D11, ни ошибки, ни предупреждения.

avalon/3.0.2
Re[4]: Странный баг Delphi XE8
От: Khimik  
Дата: 29.08.23 18:05
Оценка:
Здравствуйте, rudzuk, Вы писали:

s>> TB>Может ты кастишь указатель к инту. Когда они оба были 32 бита, все было лк. А если указатель 64 битп то при касте точность теряется и срабатывает проверка


s>> Компилятор D10, D11 выдает огшибку компиляции в таком случае. НАсчет XE8 не знаю


R>Не выдает D11, ни ошибки, ни предупреждения.


Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта. Какая тут может быть ошибка? И прошу пояснить, какие вообще возможны скрытые ошибки, если приводить типы через скобки а не через as.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[5]: Странный баг Delphi XE8
От: rudzuk  
Дата: 29.08.23 18:41
Оценка: 2 (1)
Здравствуйте, Khimik, Вы писали:

K> R>Не выдает D11, ни ошибки, ни предупреждения.


K> Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта.


В 32-битном режиме так и есть, а если повнимательнее на картинку посмотришь, то увидишь, что сборка сделана в 64-битном, где SizeOf(Pointer) = 8, а SizeOf(Integer) = 4.

K> Какая тут может быть ошибка? И прошу пояснить, какие вообще возможны скрытые ошибки, если приводить типы через скобки а не через as.


Ну какая может быть ошибка, если от указателя у тебя берется только половина указателя? Прикол в том, что такую ошибку ты можешь даже не заметить и софт с нем может работать очень долгое время, пока, указатель не начнет указывать за пределы 4 GB. Тут-то и начнутся разговоры о нормальном коде, который стал падать. Вот, кстати, если используешь SendMessage/PostMessage, где значения параметров WParam и LParam передаются с приведением типов-указателей к LongInt(something) или Integer, значит уже влип.
avalon/3.0.2
Re[5]: Странный баг Delphi XE8
От: rudzuk  
Дата: 29.08.23 18:41
Оценка:
Здравствуйте, Khimik, Вы писали:

K> R>Не выдает D11, ни ошибки, ни предупреждения.


K> Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта.


В 32-битном режиме так и есть, а если повнимательнее на картинку посмотришь, то увидишь, что сборка сделана в 64-битном, где SizeOf(Pointer) = 8, а SizeOf(Integer) = 4.

K> Какая тут может быть ошибка? И прошу пояснить, какие вообще возможны скрытые ошибки, если приводить типы через скобки а не через as.


Ну какая может быть ошибка, если от указателя у тебя берется только половина указателя? Прикол в том, что такую ошибку ты можешь даже не заметить и софт с нем может работать очень долгое время, пока, указатель не начнет указывать за пределы 4 GB. Тут-то и начнутся разговоры о нормальном коде, который стал падать. Вот, кстати, если используешь SendMessage/PostMessage, где значения параметров WParam и LParam передаются с приведением типов-указателей к LongInt(something) или Integer, значит уже влип.
avalon/3.0.2
Re[6]: Странный баг Delphi XE8
От: Khimik  
Дата: 30.08.23 06:19
Оценка:
Здравствуйте, rudzuk, Вы писали:

K>> R>Не выдает D11, ни ошибки, ни предупреждения.


K>> Я вначале перепугался, а потом проверил — и integer и pointer имеют размер 4 байта.


R>В 32-битном режиме так и есть, а если повнимательнее на картинку посмотришь, то увидишь, что сборка сделана в 64-битном, где SizeOf(Pointer) = 8, а SizeOf(Integer) = 4.


А, ну да конечно, это я сглупил.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[8]: Странный баг Delphi XE8
От: Khimik  
Дата: 30.08.23 07:25
Оценка:
Здравствуйте, swame, Вы писали:

S>но ссылка сдохла, положил


S>https://disk.yandex.ru/d/k4mMp2MCe2c4sQ


Спасибо, я включил CheckHeapForCorruption, потом FullDebugMode, запустил мою программу и ошибка не сработала. Возможно у меня не этот тип ошибки.
Вчера я почистил старые утечки памяти в моей программе и неожиданно ошибка, с которой я начал эту тему, перестала срабатывать.
Ещё я заметил, что позавчера с Win32 версией тоже срабатывала ошибка range check error на другом функционале программы, т.е. не уверен что проблема именно с преобразованием типов. Но вообще я только сейчас понял, что надо более осторожно переводить код Delphi 7 на Delphi XE 8.
Прошу кого-нибудь ответить всё-таки, какие ошибки возможны, если использовать скобки вместо as при приведении типов.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[9]: Странный баг Delphi XE8
От: rudzuk  
Дата: 30.08.23 07:56
Оценка:
Здравствуйте, Khimik, Вы писали:

K> Прошу кого-нибудь ответить всё-таки, какие ошибки возможны, если использовать скобки вместо as при приведении типов.


Всякие. Это может привести к повреждениям памяти, которые, если повезет, вызовут ошибки нарушения доступа (Access Violation). Однако, может не повезти, и память будет портиться по-тихому, вызывая в дальнейшем какие угодно аномалии.
avalon/3.0.2
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.