Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зависания потока при освобождении памяти. / 12 сообщений из 12, страница 1 из 1
27.08.2020, 10:39
    #39992851
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
Rio 10.3

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

Виснет в бесконечном цикле на SysFreeMem в этом цикле

- сам цикл
Код: 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.
@LockBlockTypeLoop:
  mov eax, $100
  {Attempt to grab the block type}
  lock cmpxchg TSmallBlockType([ebx]).BlockTypeLocked, ah
  je @GotLockOnSmallBlockType
  {The pause instruction improves spinlock performance}
  pause
  {"Busy waiting" or "sleep and retry" strategy?}
  cmp NeverSleepOnMMThreadContention, 0
  jne @LockBlockTypeLoop
  {Couldn't grab the block type - sleep and try again}
  push ecx
  push edx
  push InitialSleepTime
  call Sleep
  pop edx
  pop ecx
  {Try again}
  mov eax, $100
  {Attempt to grab the block type}
  lock cmpxchg TSmallBlockType([ebx]).BlockTypeLocked, ah
  je @GotLockOnSmallBlockType
  {Couldn't grab the block type - sleep and try again}
  push ecx
  push edx
  push AdditionalSleepTime
  call Sleep
  pop edx
  pop ecx
  {Try again}
  jmp @LockBlockTypeLoop


т.е. блок постоянно залочен.

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

Лично я получил фриз главного потока при установке названия контрола, в
Код: pascal
1.
2.
3.
4.
      WM_SETTEXT:
        begin
          P := StrNew(PChar(LParam));
          StrDispose(FText);


вот StrDispose и привел к бесконечному циклу сна при попытке освобождения.

Но то же самое наблюдается и не в главных потоках на освобождении чего угодно.

Возможно, стоит выставить NeverSleepOnMMThreadContention := True ?
...
Рейтинг: 0 / 0
27.08.2020, 11:02
    #39992861
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
Vizit0r
Код: pascal
1.
2.
3.
4.
      WM_SETTEXT:
        begin
          P := StrNew(PChar(LParam));
          StrDispose(FText);


Что такое FText?
...
Рейтинг: 0 / 0
27.08.2020, 11:36
    #39992880
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
пропа в TControl.

Чтоб было понятнее масштаб - прикладываю лог из EL

Там зависли почти все потоки.
...
Рейтинг: 0 / 0
27.08.2020, 12:13
    #39992897
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
Vizit0r
Получилось повторить у себя.

Лучше бы это посмотреть...
...
Рейтинг: 0 / 0
27.08.2020, 13:42
    #39992959
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
Это повреждение управляющих структур менеджера памяти. Зависание тут ни при чём, это лишь побочный эффект. Зависание нужно игнорировать и сосредоточиться на поиске проблем с памятью.

Чаще всего такое бывает при buffer overflow. Но если в EL эта проверка включена, и она молчит - то 100% не buffer overflow.

Как вариант - запись по устаревшему указателю в уже освобождённую память.

Ещё вариант - запись по смещению за границы буфера, т.е. за границы и выделенной памяти и проверочного блока от EL.

Если IsMultiThreaded точно стоит в True, то ой. Искать будете долго и сложно. Попробуйте начать с SafeMM.
...
Рейтинг: 0 / 0
27.08.2020, 13:57
    #39992969
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
Vizit0r
Есть многопоточное приложение.
Как вы запускаете новые потоки? Создаете объект TThread или вызываете функцию CreateThread?

Ну и я надеюсь, что это у вас не Dll
...
Рейтинг: 0 / 0
27.08.2020, 16:10
    #39993041
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
GunSmoker
Чаще всего такое бывает при buffer overflow. Но если в EL эта проверка включена, и она молчит - то 100% не buffer overflow.


Долго искал что-то связанное с Buffer overflow, не нашел. EL 7.7.8

По памяти из конфига есть только:



GunSmoker

Если IsMultiThreaded точно стоит в True, то ой. Искать будете долго и сложно.


Стоит, но не мной выставленное, по дефолту. Стоит выключить?

GunSmoker

Попробуйте начать с SafeMM.

скачал SafeMM для XE2, вечером попробую.

Спасибо.





[quot _Vasilisk_#22188086]
Vizit0r
Как вы запускаете новые потоки? Создаете объект TThread или вызываете функцию CreateThread?

Создается наследник от TThread, а он, в свою очередь, создает еще 2-3 дочерних потока по необходимости. Но основная работа идет именно в этих "первичных", основных потоках.

_Vasilisk_
Ну и я надеюсь, что это у вас не Dll

Нет, из длл используются только инди ssl dll, и только при необходимости (что бывает у одного юзера из сотни), в моем случае и в случае человека, что отправил репорт - они не использовались.
Моноприложение, так сказать.
...
Рейтинг: 0 / 0
27.08.2020, 18:06
    #39993102
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
Vizit0r, Catch memory problems. Выключать ничего не нужно.
...
Рейтинг: 0 / 0
28.08.2020, 12:25
    #39993385
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
с SafeMM почему-то начало время от времени дико отжирать память (Private Bytes) кусками по 100-200 мб до 3,5 гб. Если x86 версия дохла с OutOfMemory уже на 1,5 гб, то x64 версия доходит до 3,5 гб, и начинает "чудить" с памятью.

И да, один раз опять повисло на FreeMem.

Буду ловить дальше....
...
Рейтинг: 0 / 0
07.09.2020, 09:16
    #39996079
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
в итоге оказалось тонкое место в логике в кешере объектов, при довольно редком совпадении сразу нескольких факторов ссылка на объект переносилась в новое место, а в старом не удалялась. И в итоге, когда объект уничтожался - указатель вел куда угодно, но не на объект. Несколько раз такое происходит - и повреждение памяти становится только вопросом времени.

4 дня: логгирование всего и вся, потом анализ этих логов (точнее, сразу трех). И то, считаю, что легко отделался.
...
Рейтинг: 0 / 0
07.09.2020, 13:26
    #39996162
Зависания потока при освобождении памяти.
Vizit0r,

А вот использовали бы функцию FreeAndNil и бед не знали
...
Рейтинг: 0 / 0
07.09.2020, 13:35
    #39996170
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависания потока при освобождении памяти.
ипользовал и использую.
Но в данном случае до ссылки не доходило, она так и указывала на уже мусорную память.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зависания потока при освобождении памяти. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]