|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Необходима реализация простейшего менеджера памяти на базе VirtualAlloc. Чтобы не использовать выделение памяти средствами Delphi или FastMM, а обращаться напрямую к операционной системе. Потому что в приложении много багов, которые портят память. Выделение кусков средствами операционной системе должно помочь вызывать Access Violation если что-то пойдет не так. Как я понимаю, выглядит это примерно так: https://www.gunsmoker.ru/2009/01/blog-post.html Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
но примера реализации этих методов на базе VirtualAlloc найти не могу ... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2022, 23:25 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
SafeMM ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2022, 23:58 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Выделение кусков средствами операционной системе должно помочь вызывать Access Violation если что-то пойдет не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 00:01 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
_Vasilisk_ Наталья87 Выделение кусков средствами операционной системе должно помочь вызывать Access Violation если что-то пойдет не так. Тут дело скорее в том - чтобы один кусок программы не мог портить память, выделенную другим куском программы. В этом случае VirtualAlloc поможет. Наоборот, есть еще идея - обматывать выделяемые куски памяти "одеялом". То есть выделять вначале пару килобайт, потом запрашиваемый объем памяти, умноженный на 3 (рабочая область посередине), потом еще пару килобайт. Чтобы глючный код мог немного промахиваться и это не приводило к падению приложения. В случае FastMM или других разделяемых менеджеров памяти фактически любой баг в каком-нибудь потоке или таймере может испортить важную память основного потока и приложение упадёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 00:10 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Dmitry Arefiev SafeMM Работает под Delphi 7. Но увы, проект с ним вообще не запускается под Delphi XE8. И еще - он какой-то медленный очень. Там много функций для отладки - но тут речь не про отладку а про Release-приложение. Есть в приложении баги или нет - другой вопрос - но нужно минимизировать вероятность падения Release-приложения по причине багов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 00:16 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Наоборот, есть еще идея - обматывать выделяемые куски памяти "одеялом". То есть выделять вначале пару килобайт, потом запрашиваемый объем памяти, умноженный на 3 (рабочая область посередине), потом еще пару килобайт. Чтобы глючный код мог немного промахиваться и это не приводило к падению приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 00:20 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
_Vasilisk_ Наталья87 Наоборот, есть еще идея - обматывать выделяемые куски памяти "одеялом". То есть выделять вначале пару килобайт, потом запрашиваемый объем памяти, умноженный на 3 (рабочая область посередине), потом еще пару килобайт. Чтобы глючный код мог немного промахиваться и это не приводило к падению приложения. Исправлять можно у себя на компьютере. Пользователю зачем ошибки видеть? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 01:01 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Кроме SafeMM ни один менеджер памяти не пережил такой код: Код: pascal 1. 2. 3. 4. 5. 6.
В случае с SafeMM выдало Access Violation, но приложение не упало! Но SafeMM слишком медленный, поэтому и хотелось бы реализации на базе стандартных функций VirtualAlloc. Я думаю, поскольку память VirtualAlloc выделяется системой - подобные ошибки или пройдут незамеченными или вызовут Access Violation, но не будут валить приложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 01:59 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 _Vasilisk_ пропущено... А, понял. Цель не исправить ошибки, а завуалировать их Исправлять можно у себя на компьютере. Пользователю зачем ошибки видеть? Отсутствие ошибки порождает у пользователя уверенность что программа работает в штатном режиме. Если выдается адекватное сообщение об ошибке с кнопкой послать отчет разработчику то это нормально. Вообще странный подход конечно, ну да Ваше дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 02:11 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Все дело в том, что SafeMM не работает с модулями IdHttp, IdFtp. Экспериментальным путем было проверено, что дело не в моем проекте, а в этих модулях. Есть вот такой код - который нужно переписать с HeapAlloc на VirtualAlloc. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 02:51 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Ладно, попробую переделать SafeMM. Идея в том, чтобы выделять большой защищённый блок в 64Кб на каждый запрос по выделению. памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 11:54 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Код менеджера после переделывания. Максимально минимизированный и на базе SafeMM. Большой проект на этом менеджере работает и запускается на Delphi 7. Пустой проект с 1 формой на Delphi XE8 тоже работает. Но стоит подключить 2 модуля USES IdFtp, IdHttp; и проект не запускается - завершаясь с ошибкой Runtime Error 216 at00405353 Иногда выходит access violation at address 00000000 То же самое с исходным SafeMM - стоит подключить модули USES IdFtp, IdHttp; и при запуске приложения с 1 формой выходит ошибка access violation at address 00000000 Как заставить SafeMM работать с родными Delphi-модулями IdHttp, IdFtp или навскидку есть ли очевидные баги в модуле ниже? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100.
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 16:27 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 есть ли очевидные баги в модуле ниже? Вангую, что нужно сделать заглушки для: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 16:42 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Kazantsev Alexey Наталья87 есть ли очевидные баги в модуле ниже? Вангую, что нужно сделать заглушки для: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8.
Спасибо, помогло. И SafeMM после данного дополнения чудесным образом заработал. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 17:12 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Экспериментальным путем было проверено, что дело не в моем проекте, а в этих модулях. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 17:39 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
_Vasilisk_ Наталья87 Экспериментальным путем было проверено, что дело не в моем проекте, а в этих модулях. Интересный момент еще. Если использовать данный менеджер памяти (и выделять блоки кратные 4 Кб по каждому чиху - даже если требуется 10 байт) - при примерно 150 Мб занятой оперативной памяти (проверка Диспетчером задач на Win Xp с 4 Гб оперативы) выскакивает ошибка "Out of Memory" - хотя памяти свободной еще вагон. Видимо, есть какие-то ограничения операционной системы на количество выделяемых блоков, в какой-то момент функция VirtualAlloc перестает выделять память. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 00:18 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
_Vasilisk_ Наталья87 Экспериментальным путем было проверено, что дело не в моем проекте, а в этих модулях. Вообще странно, что SafeMM поставляется без этих методов для Delphi XE+, хотя заявлено, что он должен работать на Delphi XE+. Хотя если принять, что это все-таки сторонний менеджер памяти и писали его люди, а устроен он довольно сложно внутри - в нём могут быть и ошибки и недоработки, как в любой программе. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 00:21 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Видимо, есть какие-то ограничения операционной системы на количество выделяемых блоков, в какой-то момент функция VirtualAlloc перестает выделять память. Это называется фрагментацией адресного пространства. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 00:32 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 при примерно 150 Мб занятой оперативной памяти (проверка Диспетчером задач на Win Xp с 4 Гб оперативы) выскакивает ошибка "Out of Memory" - хотя памяти свободной еще вагон Оперативная память не имеет никакого отношения к выделенной памяти в программе. В оперативной памяти программа может занимать как меньше памяти, чем она выделила (чаще всего), так и больше. Если вы хотите смотреть за потреблением памяти вашей программы, то в диспетчере задач выберите Вид / Выбрать столбцы и поставьте галку на "Объём виртуальной памяти". Также рекомендую: https://www.gunsmoker.ru/2011/04/windows-spin-off.html ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 11:21 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
У VirtualAlloc по умолчанию гранулярность выделения памяти - 64 кб . Это значит, что в 2 Гб адресном пространстве этой функцией можно выделить не более 32'768 блоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 11:29 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Вообще странно, что SafeMM поставляется без этих методов для Delphi XE+, хотя заявлено, что он должен работать на Delphi XE+. Хотя если принять, что это все-таки сторонний менеджер памяти и писали его люди, а устроен он довольно сложно внутри - в нём могут быть и ошибки и недоработки, как в любой программе. SafeMM - это просто экспериментальная демка, proof-of-concept. Уж тем более не предполагается, что его будут использовать в релизе. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 11:32 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
_Vasilisk_ Не поможет. VirtualAlloc выделяет память страницами. Размер страницы - 4096 байт. Т.е. если вы запросили 10 байт, а обратились к 3000, то никто вам ничего не скажет. Не обязательно использовать память с начала страницы. Если цель отловить overflow, то логический блок должен заканчиваться ровно на конце физического, а начинаться где-то в середине этой 4к страницы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 11:34 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Но SafeMM слишком медленный, поэтому и хотелось бы реализации на базе стандартных функций VirtualAlloc. VirtualAlloc - это функция ядра Windows. Любой вызов ядра - это очень медленно, поскольку происходит переключение пользовательского режима и режима ядра. И с этим ничего сделать нельзя, никакое переписывание кода здесь не поможет. По сути, SafeMM - это и есть минимальная обёртка к VirtualAlloc, ничего особо больше он не делает. Поэтому общепринятая практика как раз выделять память одним большим куском, а потом логически делить его внутри пользовательского режима, не переключаясь в режим ядра. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 12:00 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
GunSmoker Наталья87 Но SafeMM слишком медленный, поэтому и хотелось бы реализации на базе стандартных функций VirtualAlloc. VirtualAlloc - это функция ядра Windows. Любой вызов ядра - это очень медленно, поскольку происходит переключение пользовательского режима и режима ядра. И с этим ничего сделать нельзя, никакое переписывание кода здесь не поможет. По сути, SafeMM - это и есть минимальная обёртка к VirtualAlloc, ничего особо больше он не делает. Поэтому общепринятая практика как раз выделять память одним большим куском, а потом логически делить его внутри пользовательского режима, не переключаясь в режим ядра. Да, так и получилось в итоге. Через мой менеджер памяти на базе VirtualAlloc работает также медленно (а то и еще медленнее), чем через SafeMM. При этом и памяти жрет больше, чем SafeMM (и приложение по причине OutOfMemory поэтому вылетает даже на 64-разрядных сборках). Т. к. SafeMM хоть и использует агрессивно VirtualAlloc и VirtualProtect, выделяя в разы больше памяти, чем нужно - но все же для мелких блоков он не использует VirtualAlloc. Попробую еще для интереса не по 4 Кб, а сразу по 64 Кб выделять. Хуже судя по всему не будет - просто Диспетчер Задач будет отображать реальный объем потребляемой памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 14:57 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
GunSmoker _Vasilisk_ Не поможет. VirtualAlloc выделяет память страницами. Размер страницы - 4096 байт. Т.е. если вы запросили 10 байт, а обратились к 3000, то никто вам ничего не скажет. Не обязательно использовать память с начала страницы. Если цель отловить overflow, то логический блок должен заканчиваться ровно на конце физического, а начинаться где-то в середине этой 4к страницы. Для отлова ошибок есть уже готовые SafeMM и FastMM. Но первый слишком медленный и скорее для Debug, а не для Release, хотя с задачей не допустить падения программы и повреждения памяти кривым кодом справляется прекрасно. Второй как-то плохо защищает память от кривого кода . Цель немного другая для Release-сборок. И состоит не только в том, чтобы отловить ошибки. Цель именно в том, чтобы ошибки в программе не приводили к повреждению памяти, последующим глюкам а то и падению приложения (у клиентов на Release-сборке). Как я полагаю - этого можно добиться либо используя агрессивные методы отлова некорректного доступа к памяти вроде SafeMM (но проблема в том, что SafeMM слишком медленный). Либо не отлавливать некорректный доступ к памяти, а просто выделять памяти больше, чем нужно, помещая данные в середину и оборачивая "одеялом". Чтобы как было как танковая броня - ошибки в одном месте программы не приводили к повреждению памяти других участков программы. Чтобы не тормозило и не потребляло горы памяти - очевидно, делать надо это не с помощью VirtualAlloc, а с помощью HeapAlloc. Если просто выделять больше памяти, чем нужно и не ловить ошибки - замедление получается всего на 30% - при этом я полагаю, это должно защищать от порчи памяти. И еще - было принято решение включить Range Check Error и Overflow Check. На Release сборках в том числе. По сути они не так уж сильно замедляют работу программы, как SafeMM, а толку в плане защиты памяти на практике от них немало. Если можно - поясните, пожалуйста, в чем я не права и заблуждаюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 15:07 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Цель именно в том, чтобы ошибки в программе не приводили к повреждению памяти, последующим глюкам а то и падению приложения (у клиентов на Release-сборке) Для того, чтобы ошибки в программе не приводили к таким последствиям у клиентов на release-сборке, их нужно отлавливать и исправлять до этого момента. Соответствующий процесс называется тестированием и отладкой. Пытаться микшировать такие проблемы у клиентов - это примерно как лечить мёртвого припарками. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 15:10 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
softwarer Наталья87 Цель именно в том, чтобы ошибки в программе не приводили к повреждению памяти, последующим глюкам а то и падению приложения (у клиентов на Release-сборке) Для того, чтобы ошибки в программе не приводили к таким последствиям у клиентов на release-сборке, их нужно отлавливать и исправлять до этого момента. Соответствующий процесс называется тестированием и отладкой. Пытаться микшировать такие проблемы у клиентов - это примерно как лечить мёртвого припарками. Так оно делается, ошибки периодически отлавливаются и фиксятся. Но к сожалению, не получается исправить их все. А клиенты жалуются, что ПО периодически (например, раз в неделю, что фиг отловишь) глючит и вылетает. Приложение состоит из 500 000 строк кода, найти что именно глючит и портит память не получается. Ставить Release-сборки с SafeMM тоже по причине замедления работы ПО в несколько раз. Поэтому и хочется понять, что можно сделать кроме Range Check и Overflow Check - чтобы защитить память - но сильно при этом не замедлить программу. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 15:19 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Поэтому и хочется понять, что можно сделать кроме Range Check и Overflow Check - чтобы защитить память - но сильно при этом не замедлить программу. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 15:23 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
авторПриложение состоит из 500 000 строк кода, найти что именно глючит и портит память не получается. Ставить Release-сборки с SafeMM тоже по причине замедления работы ПО в несколько раз. Поэтому и хочется понять, что можно сделать кроме Range Check и Overflow Check - чтобы защитить память - но сильно при этом не замедлить программу. Для начала организовать показ стека в сообщении об ошибках ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 15:27 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
GunSmoker Если вы хотите смотреть за потреблением памяти вашей программы, то в диспетчере задач выберите Вид / Выбрать столбцы и поставьте галку на "Объём виртуальной памяти". Увы, но при использовании VirtualAlloc-менеджера с блоками, кратными 4 Кб на каждый чих - в колонке "Виртуальная память" показывает также всего примерно 150 Мб - хотя память уже закончилась и вовсю сыпется "Out of memory". Но вот если выделять блоками не по 4 Кб, а по 64 Кб - как и предполагалось, момент "Out of memory" наступает примерно при тех же условиях (не раньше и не позже), но зато в колонке "Виртуальная память" показывает реально потребляемый объем (ну или близко к тому). В общем, с VirtualAlloc эксперименты закончились. Осталось понять, как защитить память на Release-сборках от глюков в программе и от случайных ошибок и падений ПО примерно раз в неделю. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 15:30 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87Осталось понять, как защитить память на Release-сборках от глюков в программе и от случайных ошибок и падений ПО примерно раз в неделю. Обычно для этого используют code review и уже названные дампы падения, но в вашем случае это бесперспективняк. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 15:35 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Увы, но при использовании VirtualAlloc-менеджера с блоками, кратными 4 Кб на каждый чих - в колонке "Виртуальная память" показывает также всего примерно 150 Мб - хотя память уже закончилась и вовсю сыпется "Out of memory". Kazantsev Alexey Это называется фрагментацией адресного пространства. Когда вы выделяете только 4 кб, то выделяется ровно одна страница памяти (4 кб), но память с 5-го по 64 кб оказывается недоступной (unused), поскольку следующий блок можно выделить только начиная с 64-го кб. Изучать раскладку памяти приложения можно с помощью VMMap . ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 15:46 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
По итогу - в попытках имитировать ошибки в программе, обращаясь к случайным адресам памяти и записывая туда какие-либо значения - лучше всего показал SafeMM, героически отражая атаки, с ним дольше всего программа не падала. Как стандартный менеджер памяти, так и FastMM в этом случае сдались гораздо быстрее и приложение упало быстро. Хорош, получается, SafeMM - но медленный. Вот бы его как-нибудь ускорить ... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 16:11 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Сама тема невероятно удивительная. Попытка укрепить изделие из.... и палок, намазав побольше ..... Для начала надо выяснить причины падения (емли их много) то самую частую и устранить. Мой хрустальный шар говорит мне что большая часть программы - копипаст. Это означает, что ошибку во множестве мест можно будет починить автозаменой. Но тут конечно программист нужен ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 17:02 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Michael Longneck Для начала надо выяснить причины падения (емли их много) то самую частую и устранить Так вот никак не получается уже больше, чем полгода. Падает редко - поэтому сложно отловить и устранить. Поэтому и возникает идея, как защитить память, не снизив при этом сильно скорость программы. Потому что пользователям нужен стабильный продукт уже сейчас, а не в далеком будущем, когда баги будут устранены. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 17:09 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Michael LongneckСама тема невероятно удивительная. Попытка укрепить изделие из.... и палок, намазав побольше ..... Как и любая другая тема данного топикстартера. "Фирменный стиль", так сказать... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 17:19 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Так вот никак не получается уже больше, чем полгода. Вам уже не раз сказали: для этого нужен программист. Нужно организовать нормальный процесс тестирования. Сделать хотя бы пару десятков сценариев основных операций и гонять их по кругу в тестовой версии, реагируя на замеченные дефекты работы с памятью. Ещё было бы очень нехило, чтобы программист сделал поверхностный code review этим страшным и ужасным 500.000 строк - довольно вероятно, что он ткнёт пальцем со словами "вот это хреновая практика, надо переделать везде". И в целом я примерно на 99% уверен, что если бы полгода назад программист взялся бы за эту работу - то сейчас в приложении вместо 500.000 глючащих строк было бы 200.000 отлаженных. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 17:20 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
softwarer Наталья87 Так вот никак не получается уже больше, чем полгода. Вам уже не раз сказали: для этого нужен программист. Нужно организовать нормальный процесс тестирования. Сделать хотя бы пару десятков сценариев основных операций и гонять их по кругу в тестовой версии, реагируя на замеченные дефекты работы с памятью. Ещё было бы очень нехило, чтобы программист сделал поверхностный code review этим страшным и ужасным 500.000 строк - довольно вероятно, что он ткнёт пальцем со словами "вот это хреновая практика, надо переделать везде". И в целом я примерно на 99% уверен, что если бы полгода назад программист взялся бы за эту работу - то сейчас в приложении вместо 500.000 глючащих строк было бы 200.000 отлаженных. Проблема еще в том, что приложение до этого работало почти 10 лет - и немного подглючивало - но терпимо и в рамках нормы. А в последнее время ошибки памяти и вылеты приняли какой-то прямо зверский вид, вылетать и глючить стало чаще, даже старый функционал, который вроде бы не менялся. Причем непонятно, в какой версии это началось, все происходило как-то постепенно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 18:20 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Более того, эту закономерность можно проследить из Ваших топиков с примерами кода. Особенно с дикими костылями, которые как раз изменяют поведение старого кода лишь бы его не править. О чём вам каждый раз говорят. Но продолжайте стоять на своём, это даже любопытно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 18:44 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
авторнемного подглючивало - но терпимо и в рамках нормы в мемориз ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 19:04 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Проблема еще в том, что приложение до этого работало почти 10 лет - и немного подглючивало - но терпимо и в рамках нормы. А в последнее время ошибки памяти и вылеты приняли какой-то прямо зверский вид, вылетать и глючить стало чаще, даже старый функционал, который вроде бы не менялся. Причем непонятно, в какой версии это началось, все происходило как-то постепенно. Боюсь спросить - в пределах нормы - это как? Что вы там такое считаете, что вам память вагонами нужна? Возможно стоит поменять подход и крутить расчеты НЕ выделяя дополнительную память, а переиспользуя выделенную? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 19:32 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
DarkMaster Наталья87 Проблема еще в том, что приложение до этого работало почти 10 лет - и немного подглючивало - но терпимо и в рамках нормы. А в последнее время ошибки памяти и вылеты приняли какой-то прямо зверский вид, вылетать и глючить стало чаще, даже старый функционал, который вроде бы не менялся. Причем непонятно, в какой версии это началось, все происходило как-то постепенно. Боюсь спросить - в пределах нормы - это как? Ну если, например, вылетает раз в полгода, глючит иногда. У 5% пользователей. То в пределах нормы. А в последнее время прямо вал обращений - программа глючит, падает раз в неделю, причем чуть ли не у половины пользователей. И фиг знает, в чем там может быть дело. Некоторые просят перехода на старую версию. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 20:26 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87, предлагаю ход конём: при падении перезапускать приложение. Майкрософт так и делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 20:34 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Лучше Windows перезапускать ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 21:14 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Вот мой защищенный менеджер памяти. Защищен от случайных промахов за границы массивов. Правда, не защищен от обращения по старым ссылкам ранее выделенной памяти. Будем надеяться этого совместно с Range Check и Overflow Check будет достаточно, чтобы приложение перестало падать. Работает в 2 раза медленнее стандартного и FastMM, но быстрее, чем SafeMM, современные компы потянут, к тому же SQL-запросы не будут работать медленнее, т. к. их выполняет не программа, а Firebird поэтому общее замедление пользователь может и не почувствовать. Пока у меня на компьютере не глючит, будем тестировать на пользователях. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 21:23 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
500 тысяч строк - это не очень много... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 21:55 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 По итогу - в попытках имитировать ошибки в программе, обращаясь к случайным адресам памяти и записывая туда какие-либо значения - лучше всего показал SafeMM, героически отражая атаки, с ним дольше всего программа не падала. Как стандартный менеджер памяти, так и FastMM в этом случае сдались гораздо быстрее и приложение упало быстро. Хорош, получается, SafeMM - но медленный. Вот бы его как-нибудь ускорить ... "SafeMM нельзя использовать в релизе, только в отладке, для поиска ошибок доступа к памяти" Это его основная фича Он запросто может всю память сожрать и приложение упадёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 00:27 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
kealon(Ruslan) и приложение упадёт. это терпимо и в рамках нормы (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 06:01 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Дегтярев Евгений, Тут как бы в идеале для ТС: разобраться зачем нужен SafeMM(как он работает) и пофиксить баги, а не героически отражать атаки отладочным инструментом ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 09:30 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Справедливости ради, вполне возможно, что ресурсов фиксить баги нет, а рабочий релиз нужен вотпрямщас. При этом падения с описанной частотой приемлемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 10:39 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal а рабочий релиз нужен вотпрямщас Да, прямо в точку. Хоть как-то работающий релиз нужен позарез. Использовать старые версии годичной давности (которые меньше глючат и меньше падают) не вариант - т. к. старые версии постепенно перестают быть актуальными для пользователей ввиду недостаточного функционала. А кто уже обновился ему и вовсе назад на старые версии не перейти. Fr0sT-Brutal , . При этом падения с описанной частотой приемлемы. А кто ж их спрашивать будет, эти падения - приемлемы они или нет? Программа падает и никого не спрашивает, приемлемо это или нет. В последние дни вроде падать стало реже. Не знаю, благодаря моему менеджеру памяти, который выделяет память с запасом или благодаря включению в релизы Range Check Error и Overflow Check Error. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 10:52 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal Справедливости ради, вполне возможно, что ресурсов фиксить баги нет, а рабочий релиз нужен вотпрямщас. Угу, оно всегда так. Делать хорошо - ресурсов нет, а делать плохо, мучиться, переделывать и в итоге тратить в десять раз больше - они откуда-то находятся. И что самое забавное - в результате ресурсов никогда нет, потому что они всегда уходят на борьбу с ранее созданными хренями. И так продолжается до тех пор, пока результат просто волевым усилием не спускается в унитаз, и вместо него с нуля не делается такое же дерьмо, только на другой технологии. Часто теми же людьми - что, собственно, и обеспечивает "такое же дерьмо". ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 11:11 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Может это использовать https://bitbucket.org/shadow_cs/delphi-leakcheck ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 11:40 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
ziv-2014, да у них не утечки, у них скорее всего доступ к убитым объектам по типу Код: pascal 1. 2. 3.
SafeMM + EuricaLog например, как раз то, что доктор прописал искать и править ну и спич возникнет как всегда вокруг .Free-FreeAndNil() ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 20:45 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
я когда искал утечки с помощью fastmm был вынужден делать freeandnil у объектов так как fastmm показывал утечку указателя, при том что сам объект был убит. так с тех пор и привык им пользоваться ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 21:40 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
энди> был вынужден делать freeandnil у объектов так как fastmm энди> показывал утечку указателя, при том что сам объект был убит Для обычных объектов или интерфейсов? Обычно всякие чеккеры (в т.ч. в других ЯП и средах, типа валгринд и пр.) работают по парам Create-Free (ну или malloc-delete). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 22:13 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, они просто не знаю про FreeAndNil хотя правды для: автопоинты другие костыли имеют SafeMM жёстче работает, он просто память не освобождает, а доступы к ней все запрещает на уровне страниц ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 22:34 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам энди> был вынужден делать freeandnil у объектов так как fastmm энди> показывал утечку указателя, при том что сам объект был убит Для обычных объектов или интерфейсов? Обычно всякие чеккеры (в т.ч. в других ЯП и средах, типа валгринд и пр.) работают по парам Create-Free (ну или malloc-delete). обычные объекты, я вообще интерфейсами практически не пользуюсь ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 22:43 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
kealon(Ruslan)да у них не утечки, у них скорее всего доступ к убитым объектам по типу Бери выше, у них рандомный доступ к памяти: 22437654 Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 23:12 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
энди> обычные объекты Это странно. AFAIU, это баг и если у тебя воспроизводится на чистом проекте - вышли им, пусть правят. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 08:43 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov kealon(Ruslan)да у них не утечки, у них скорее всего доступ к убитым объектам по типу Бери выше, у них рандомный доступ к памяти: 22437654 Этот злополучный модуль переписан. Глюков стало меньше. При включении Range Check Error еще меньше. Но к сожалению, глюков все еще много. Особенно в сборке, которая на XE8, прямо какой-то глюконат. На Delphi 2007 глюков меньше, но в последнее время и там почему-то стали чаще. Да, мы все еще продолжаем пилить проект на D2007, время от времени собирая на XE8. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 10:23 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
kealon(Ruslan) Гаджимурадов Рустам, они просто не знаю про FreeAndNil хотя правды для: автопоинты другие костыли имеют SafeMM жёстче работает, он просто память не освобождает, а доступы к ней все запрещает на уровне страниц Если код кривой, но давно работающий и в нем тупо переписать Free на FreeAndNil - пробовали. Но в этом случае иногда начинают вылезать баги, которых раньше не было (уже не помню пример кода - но такая ситуация была уже - когда срочно пришлось вернуть обратно Free). Так что если нет в планах рефакторить код - лучше не заменять просто так Free на FreeAndNil. А новый код, наверное, лучше писать с FreeAndNil. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 15:01 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Но в этом случае иногда начинают вылезать баги, которых раньше не было Да-да Не было ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 15:09 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
softwarer Наталья87 Но в этом случае иногда начинают вылезать баги, которых раньше не было Да-да Не было FreeAndNil - хрень полная, которая только вводит в заблуждение. Пример. Есть у нас класс Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Вызываем код с Free: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Срабатывает всё четко, выдает сообщение "5". Теперь вызываем код с FreeAndNil: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Поведение программы меняется - теперь она вообще никаких сообщений не выдает. То есть получается, метод класса Free или Destroy не отрабатывает (а ведь в этих методах могут быть методы освобождения памяти объектов, созданных классом, а не освобождать это уже утечки памяти). И самое главное - поведение программы меняется. И где в первом варианте с Free были баги? Их действительно не было, но с заменой на FreeAndNil они появились (память не освободилась, а ведь там может быть не только динамический массив, но и сложный объект и т. д.) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 16:08 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 FreeAndNil - хрень полная, которая только вводит в заблуждение. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 16:14 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
- ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 16:17 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Кажется, дошло. Во всем проекте я получается, неверно использую деструкторы. Надо писать c override . Код: pascal 1. 2. 3. 4. 5.
Тогда и FreeAndNil будет нормально работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 16:17 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 FreeAndNil - хрень полная, которая только вводит в заблуждение. Компьютер тоже - хрень полная. Займитесь чем-нибудь, что Вам по силам. Из соображений деликатности не буду приводить примеров, чем именно. Наталья87 Пример. Есть у нас класс Божечки Я, конечно, подозревал, какой код у вас в приложении, но я вас недооценил. Наталья87 Поведение программы меняется - теперь она вообще никаких сообщений не выдает. И причиной этому не детские ошибки, которые Вы ухитрились влепить в первых пяти строчках своего примера, а хреновый FreeAndNil Вы способны эти ошибки хотя бы найти или Вам помочь? P.S. Способны. Ну.. уже плюс, конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 16:18 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
softwarer Божечки Я, конечно, подозревал, какой код у вас в приложении, но я вас недооценил. Да я теперь сама офигеваю, как 500 тысяч строк кода (рабочего, но написанного в таком стиле) переписывать, написанных за более, чем 10 лет, на правильный стиль. Похоже, надо было раньше придти к вам, пока проект был не таким большим. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 16:32 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87> 500 тысяч строк кода (рабочего, но Наталья87> написанного в таком стиле) переписывать, Наталья87> написанных за более, чем 10 лет 1. 500 тыщ это не так уж и много, тем паче за 10 лет. 2. Не "рабочего", а запускающегося и как-то работающего. 3. Кажется, я Вам уже говорил - не учитесь методом тыка. Вы, кажется, тогда мне что-то огрызнулись. Нет, методом проб и ошибок тоже можно, конечно, но сильно дольше. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 16:46 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Кажется, дошло. Во всем проекте я получается, неверно использую деструкторы. Надо писать c override Все они обязаны быть исправлены. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 17:15 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
YuRock Наталья87 Кажется, дошло. Во всем проекте я получается, неверно использую деструкторы. Надо писать c override Все они обязаны быть исправлены. Надо, но все руки не доходят, но буду делать, тут вариантов не остается уже. У меня сейчас накопилось их в программе 2500 штук. Большинство глупые вроде "variable was declared, but never used" или "variable might not be initialized", хотя по коду четко видно, что переменная не может быть не инициализирована. Правда некоторые и по делу, но найди попробуй в такой куче, какие по делу, а какие просто так. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 17:21 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Надо, но все руки не доходят, но буду делать, тут вариантов не остается уже. Если криво писать "потому что нужен релиз прямо сейчас", руки никогда не дойдут. Они так и будут вечно заняты копанием в куче не будем говорить чего. Наталья87 У меня сейчас накопилось их в программе 2500 штук. (Застрелился второй раз кряду). А я-то, помнится, с ужасом вспоминал, как в джуновские времена пинал своё руководство, пока не добился права исправить порядка пятисот штук, которые они наплодили в проекте. И как после этого вдруг исчезли пара десятков таинственных ошибок, которые всё не получалось исправить. Наталья87 Большинство глупые вроде "variable was declared, but never used" или "variable might not be initialized", хотя по коду четко видно, что переменная не может быть не инициализирована. Правда некоторые и по делу, но найди попробуй в такой куче, какие по делу, а какие просто так. Во-первых, они все по делу. Варнингов просто так в дельфе нет. Если совсем точно - я знаю только один, и я стопроцентно уверен, что у вас его не бывает. А во-вторых, не надо искать и разделять. Надо исправить все и держать по нулям. Строго и без вариантов. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 17:37 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 все руки не доходят ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 17:56 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Правда некоторые и по делу, но найди попробуй в такой куче, какие по делу, а какие просто так. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2022, 17:57 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Кстати, да. Наверное нубский вопрос. Почему Код: pascal 1. 2. 3. 4. 5. 6.
Это - ок А вот Код: pascal 1. 2. 3. 4. 5. 6.
Это - Variable 'Obj' might not have been initialized? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 08:40 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Exteris, вставь в TMyObject.Create какой нибудь raise Exception.Create('Test') и посмотри ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 08:59 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
[quot Exteris#22440507]Кстати, да. Наверное нубский вопрос. Почему Код: pascal 1. 2. 3. 4. 5. 6.
Блин, у меня половина кода в таком стиле написана. Переписываю. А по поводу FreeAndNil - была вчера попытка на него перейти, а также установить override для всех Destroy. Но пошло такое количество глюков (Access Violation, Range Check Error и прочее), что испугалась и пришлось версию откатить назад. Видимо, надо сразу код в правильном стиле писать, переписывать будет сложнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 10:06 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Zelius Exteris, вставь в TMyObject.Create какой нибудь raise Exception.Create('Test') и посмотри Ну и? Чем в этом случае поможет данный warning? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 10:09 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 А по поводу FreeAndNil - была вчера попытка на него перейти, а также установить override для всех Destroy. Но пошло такое количество глюков (Access Violation, Range Check Error и прочее), что испугалась и пришлось версию откатить назад. Видимо, надо сразу код в правильном стиле писать, переписывать будет сложнее. Access Violation у вас как раз из-за того что освобождёнными объектами пользовались, а теперь ссылки на них обнуляются и обращение по этим указателям даёт AV поочерёдно надо делать поправили один объект, добавили у него метод Код: pascal 1.
и смотрите где вы его освобождаете за денёк управитесь ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 10:20 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 Большинство глупые вроде (...) "variable might not be initialized", хотя по коду четко видно, что переменная не может быть не инициализирована. Данный варнинг может быть ложным, но что-то я сомневаюсь, учитывая контекст говнософта. Скорее всего, это не ошибки глупые :) Кидай примеры, поглядим, кто там глупее - компилятор или погромист ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 10:28 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Exteris Zelius Exteris, вставь в TMyObject.Create какой нибудь raise Exception.Create('Test') и посмотри Ну и? Чем в этом случае поможет данный warning? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 10:55 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Exteris А вот Код: pascal 1. 2. 3. 4. 5. 6.
Это - Variable 'Obj' might not have been initialized? В выделенном месте, при исключении в конструкторе, произойдет попытка освобождения объекта по мусорному указателю. О чем варнинг и пишет: "Переменная может быть не инициализирована". ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 10:59 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
я просто поражаюсь, как некоторые могут селёдку без водки! © как, не имея элементарных понятий в ООП, можно было наговнокодить такую КУЧУ?! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 12:41 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Мимопроходящий как, не имея элементарных понятий в ООП, можно было наговнокодить такую КУЧУ?! Знаю погромистов, пишущих код смотря ролики ютюба ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 12:51 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Мимопроходящий как, не имея элементарных понятий в ООП, можно было наговнокодить такую КУЧУ?! Долго и старательно. Я вроде вчера или позавчера писал про то, что самое страшное бедствие в нашей профессии - неленивый программист. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 13:29 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
softwarer Мимопроходящий как, не имея элементарных понятий в ООП, можно было наговнокодить такую КУЧУ?! --- а куда подевались индусские программисты? --- вошли в совет директоров M$ © ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 13:38 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
softwarer Мимопроходящий как, не имея элементарных понятий в ООП, можно было наговнокодить такую КУЧУ?! Долго и старательно. Я вроде вчера или позавчера писал про то, что самое страшное бедствие в нашей профессии - неленивый программист. Я помню - когда начала изучать программирование в Turbo Pascal было дело. Так уже на 3-й изучения день столкнулась ограничением вроде называлось "code segment too large" или что-то подобное - размер кода больше 64 килобайт. Так получилось за счет Copy&Paste кода с последующими правками, понимание что такое циклы, файлы, константы и модули было слабое тогда. Препопадатель была в офигении - говорит ни разу с подобным не сталкивались за несколько лет - а потом через несколько дней говорит - ну значит изучайте что такое модули. Жаль, что не сохранился этот код - но там реально был говнокод - тот код, что здесь в примерах покажется цветочками. Получается такой код таким образом - код написан, работает, программа работает без сообщений об ошибках и не глючит - значит, всё нормально. У нас нет времени исправлять ошибки, новый функционал надо пилить, так и живём. Так что полмиллиона строк наговнокодить за несколько лет никаких проблем. Вопрос как его потом поддерживать, а сейчас вообще даже править страшно пусть и с лучшими намерениями вроде Free на FreeAndNil, т. к. при попытках что-то править начинает жёстко глючить. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 13:47 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87, 22306846 Анна Петровна, ты что ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 14:50 |
|
Простейший менеджер памяти на базе VirtualAlloc
|
|||
---|---|---|---|
#18+
Наталья87 У нас нет времени исправлять ошибки Наталья87 вообще даже править страшно пусть и с лучшими намерениями вроде Free на FreeAndNil ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2022, 17:37 |
|
|
Start [/forum/topic.php?all=1&fid=58&tid=2036594]: |
0ms |
get settings: |
22ms |
get forum list: |
10ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
80ms |
get topic data: |
19ms |
get forum data: |
4ms |
get page messages: |
4068ms |
get tp. blocked users: |
2ms |
others: | 174ms |
total: | 4395ms |
0 / 0 |