|
|
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
Не могу понять где именно проблема. VCL, Токио. Скачиваю текст через IdHTTP, засовываю его в TJSONObject, разбираю что мне надо, генерирую запрос при помощи Format() и конкатенаций, отправляю в БД через ADODB.Connection. Цикл повторяет итерации "пока есть задания", разделил на отдельные методы, переменные в основном локальные. Часто вызывается TJSONObject.GetValue() и Format() с константной в первом параметре. Ну ещё в одном методе есть локальная переменная "array of Int64" размером например 2500. Вот работает часа три-четыре - и вылетает с EOutOfMemory. Но в Диспетчере у приложения пишет всего 150-200 метров памяти занято. Вроде память не хапаю, вроде всё что брал освобождаю, а остальное само должно. Отладчик показывает в какие-то левые строки кода и в kernel. Как раскопать-то причину? В зависимости от скорости скачивания, объёма файла и скорости разбора - чтоб повторить ошибку мне надо часа 4 ждать... Я уже от балды перепробовал ставить передачу параметров в методах как Var и как Const - не влияет. Может надо было полученное от TJSONObject.GetValue() как-то явно освобождать? Или может Format(CONST_STRING, [...]) нельзя? Или может Format(... , [SomeMethod()]) нельзя? Или может Var:=Format(... , [Var]) нельзя? Или может стоит массив Int64 вынести куда-то внаружу? Но почему? Я просто уже препрочитал свой код раз 40 - и не вижу где может быть проблема. Уже во всём чём попало сомневаюся. А вот чего отладчик показывает мимо? Попытался наколеночного кода добавить - тепеть на вызов метода кажет, а судя по наколеночному коду метод отработал полностью. Проблема типа при выхое из метода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2018, 15:15 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
FastMM может и через 10 минут работы показать место утечки. https://stackoverflow.com/questions/8601504/how-to-enable-full-debug-mode-in-fastmm4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2018, 15:18 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
гм... Спасибо, попробуем... После того как оно снова вылетит... Я такими темпами просто загружу уже всю информацию так и не найдя ошибку))) Так чего там где надо было раскомментировать-то? А может ли быть что в Токио оно встроено? А что по тем глупейшим вопросам из предпоследнего абзаца? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2018, 16:04 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
СалямиНо в Диспетчере у приложения пишет всего 150-200 метров памяти занято. Оперативная память <> адресное пространство. Быстро подтвердить это может VMMap . http://www.gunsmoker.ru/2011/04/windows-spin-off.html Используйте отладочный менеджер памяти с возможностью поиска утечек (к примеру, FastMM в полном отладочном режиме). http://www.gunsmoker.ru/2009/05/blog-post_24.html http://www.transl-gunsmoker.ru/2010/06/blog-post.html А так - ошибка в 42 строке. Без кода и логов телепатов тут нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2018, 16:15 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
Большое спасибо, будем читать и пробовать... GunSmokerошибка в 42 строке Код: pascal 1. гм! Холмс! Это поразительно! Ведь если никогда не вызывать этот метод - то и ошибки абсолютно точно никогда не будет! Но как вы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2018, 16:35 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
Вылетает всегда с одинаковым: Debugger Exception Notification--------------------------- Project GrabData_CIKRF_Project.exe raised exception class EOutOfMemory with message 'Out of memory'. ---------------------------Когда вылетает, смотрю в отладчик, и обычно там примерно такое: Отладчик:74a9dc18 KERNELBASE.RaiseException + 0x48 :0040abb5 @UStrSetLength + $2D :0040abb5 @UStrSetLength + $2D UnitWorker.TWorkThread.ProcessData(...) ... Отладчик:74a9dc18 KERNELBASE.RaiseException + 0x48 :0040c125 DynArraySetLength + $171 :0040c125 DynArraySetLength + $171 :0040c266 @DynArraySetLength + $A IdIOHandler.TIdIOHandler.ReadBytes((0, 0, 0, 0, 0, 0, 0, 0, 0, ... // очень много нулей... IdIOHandler.TIdIOHandler.ReadStream($2F1B140,1552,False) IdHTTP.ReadChunked IdHTTP.TIdCustomHTTP.ReadResult($2E86C30,$2F0BC80) IdHTTP.TIdHTTPProtocol.ProcessResponse((...)) IdHTTP.TIdCustomHTTP.DoRequest(???,'...',nil,$2F1B140,(...)) IdHTTP.TIdCustomHTTP.Get('...',$2F1B140,(...)) IdHTTP.TIdCustomHTTP.Get('...',(...)) IdHTTP.TIdCustomHTTP.Get('...') UnitWorker.TWorkThread.ProcessDataGet(...) ... И когда программа опять вылетела, проверил что в отладчике всё то же самое, как обычно нажал "Продолжить", программа выдала уже свой MessageBox с сообщением об ошибке, закрываю форму "крестиком", ожидаю окна FastMM - но его нету. Сперва растерялся даже, но потом гляжу - форма-то пропала, но процесс программы висит, IDE предлагает только "Pause" и "Reset". Ждал, ждал... В "Диспетчере задач" используемая память то уменьшалась, то увеличивалась, процессор на процетов 6-7 кушает. Мне как бы чего, дальше ждать или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 01:36 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
СалямиЖдал, ждал... В "Диспетчере задач" используемая память то уменьшалась, то увеличивалась, процессор на процетов 6-7 кушает.Похоже на 17-ю строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 01:50 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
YuRockСалямиЖдал, ждал... В "Диспетчере задач" используемая память то уменьшалась, то увеличивалась, процессор на процетов 6-7 кушает.Похоже на 17-ю строку.О, сорри, не заметил, раньше уже 42-ю отгадали же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 01:52 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
Вы не поняли суть последнего сообщения. Подключил FastMM, закрываю программу - а окна FastMM нету и процесс висит в непонятном состоянии! Без FastMM подобного не бывало. Что произошло? Это нормально? Мне дальше ждать пока оно "додумает" или "произошло нечто страшное" и просто прибить процесс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 02:10 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
Ты просто не понимаешь, для чего нужен FastMM4. Это всего лишь диспетчер памяти, который может при завершении приложения показывает неосвобожденную перед завершением приложения память. Если приложением "вылетает" - FastMM4 тебе не поможет. Попробуй запустить приложение и завершить его "нормально", до вылета. Возможно, FastMM4 покажет проблему с неосвобожденной памятью. Если приложение корректно освобождает занятую память - FastMM4 тебе ничего не покажет и, соответственно, не поможет. Даже если приложение хапает памяти больше, чем может съесть и в итоге вылетает с Out Of Memory. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 02:46 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
Я понимаю. Просто ждал окно с информацией об неосвобожденной памяти (сделал чтоб она абсолютно точно была), а получил процесс в "коме". До вылета будет сложно. Алгоритм на данной стадии разработки не рассчитан на прерывание процесса. Хотя... Попробую запустить на получение только одной ветки "дерева"... чччДЕсли приложением "вылетает" - FastMM4 тебе не поможет.э... Вроде ж и при вылетах показывает. Во всяком случае на пустом проекте для проверки FastMM4 показывало. Оно же не в совсем трубу вылетает, а в "Try Except". Ладно, оставлю процесс на ночь "думать". Утром посмотрим... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 03:06 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
Салями, хотя всё что брал вроде освобождаю Код: pascal 1. 2. или добавь планок памяти, собери x64 и спи спокойно ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 09:14 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
так же телепатически, навскидку если вы делаете это в потоке, то нужно не забывать, что все функции форматирования IntToStr, FloatToStr, Format и т.д. требуют обязательно третий параметр formatSettings. Правда в этом случае не OutOfMemory а Access Violation ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 09:44 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
krapotkinтак же телепатически, навскидку если вы делаете это в потоке, то нужно не забывать, что все функции форматирования IntToStr, FloatToStr, Format и т.д. требуют обязательно третий параметр formatSettings. Правда в этом случае не OutOfMemory а Access ViolationОго, это с какой версии так стало?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 09:58 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
сколько себя помню http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_Format@string@array_of_const.html]вот например авторTwo syntax forms are given for Format. The first form of Format is not thread-safe, because it uses localization information contained in global variables. The second form of Format, which is thread-safe, refers to localization information contained in the FormatSettings parameter. Before calling the thread-safe form of Format, you must populate FormatSettings with localization information. To populate FormatSettings with a set of default locale values, call GetLocaleFormatSettings. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 10:14 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
krapotkinесли вы делаете это в потоке, то нужно не забывать, что все функции форматирования IntToStr, FloatToStr, Format и т.д. требуют обязательно третий параметр formatSettings. то-то я смотрю, просто format в потоке не работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 10:41 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
krapotkinсколько себя помню http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_Format@string@array_of_const.html]вот например авторTwo syntax forms are given for Format. The first form of Format is not thread-safe, because it uses localization information contained in global variables. The second form of Format, which is thread-safe, refers to localization information contained in the FormatSettings parameter. Before calling the thread-safe form of Format, you must populate FormatSettings with localization information. To populate FormatSettings with a set of default locale values, call GetLocaleFormatSettings. Отстал я от жизни. До D6 (в D7 по моему тоже) включительно такого не было (как и типа TFormatSettings). Все глобальные переменные в SysUtils вычитываются в initialization 1 раз и потом не меняются, работают только на чтение, во всех потоках. Видимо, с какой-то версии они начали меняться в процессе работы программы. Не знал. Добавился еще один минус в идею обновиться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 11:41 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
YuRock, Ключевое слово "переменные", т.е. приложение может их изменить при необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 11:56 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
krapotkinфункции форматирования IntToStr , FloatToStr, Format и т.д. требуют обязательно третий параметр formatSettings. http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_IntToStr@Int64.html]IntToStr ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 12:37 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
инт конечно я погорячился, но те кто зависит от formatSettings... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 13:04 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
Салямипроцесс программы висит, IDE предлагает только "Pause" и "Reset". Ждал, ждал... В "Диспетчере задач" используемая память то уменьшалась, то увеличивалась, процессор на процетов 6-7 кушает. Мне как бы чего, дальше ждать или как? Есть мнение, что FastMM нужно много времени, чтобы собрать информацию о всех 2 Гб выделенной памяти. Можно нажать на Pause, открыть окно Threads, переключиться в главный поток, открыть окно Call Stack и проверить эту гипотезу. Также можно не дожидаться выброса исключения Out of memory и сдампить память в файл на середине процесса . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 13:11 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
alekcvpYuRock, Ключевое слово "переменные", т.е. приложение может их изменить при необходимости. Да, могут. Мои приложения даже меняют иногда одну - DecimalSeparator (которая Char). Не думаю, что это может привести к AV. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 13:29 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
СалямиВ "Диспетчере задач" используемая память то уменьшалась, то увеличивалась Совершенно не понятно, о какой памяти идёт речь. По умолчанию Диспетчер задач показывает оперативную память, занимаемую программой. Так называемый working set. Это значение ну никак не связано с реально выделенной памятью в твоей программе. Ну вообще никак. Оно показывает лишь интенсивность использования памяти. Программа много обращается к разной памяти? Working set будет большой. Программа обращается к узкому набору блоков? Working set будет маленький. Даже если программа вообще-то дофига выделила памяти. Нужно включить столбец Private memory (я не знаю, как он называется в стандартном Диспетчере) - это значение и будет показывать, сколько памяти выделила программа. Вот, возьми на вооружение немножко диагностического говно-кода: Код: 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. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. Размести вывод куда-нибудь в доступное место и копируй значения сюда, на форум. P.S. Значение Allocated будет работать только в старых версиях Delphi. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 13:41 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
Сделать несколько итераций (да хотя бы одну) и нормально завершить приложение. Менеджер должен показать наличие утечек. Не знаю, что там сейчас в Токио, а в XE3 нормально AQtime работает (Allocation profile, ReferenceCounter). Если все нормально освобождается, отчет менеджера должен быть пустым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 13:52 |
|
||
|
Вылетает с EOutOfMemory, хотя всё что брал вроде освобождаю
|
|||
|---|---|---|---|
|
#18+
СалямиМне дальше ждать пока оно "додумает" Ждать. Пока не соберет всю информацию. Если утечек много, то процесс не быстрый. А еще лучше просто запустить программу минут на 5, завершить и посмотреть на список утечек kep-koили добавь планок памятиЧто за бред? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 14:04 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39621305&tid=2041074]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
170ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 483ms |

| 0 / 0 |
