powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зависания потока при освобождении памяти.
12 сообщений из 12, страница 1 из 1
Зависания потока при освобождении памяти.
    #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
Зависания потока при освобождении памяти.
    #39992861
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r
Код: pascal
1.
2.
3.
4.
      WM_SETTEXT:
        begin
          P := StrNew(PChar(LParam));
          StrDispose(FText);


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

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

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

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

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

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

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

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

Ну и я надеюсь, что это у вас не Dll
...
Рейтинг: 0 / 0
Зависания потока при освобождении памяти.
    #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
Зависания потока при освобождении памяти.
    #39993102
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r, Catch memory problems. Выключать ничего не нужно.
...
Рейтинг: 0 / 0
Зависания потока при освобождении памяти.
    #39993385
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с SafeMM почему-то начало время от времени дико отжирать память (Private Bytes) кусками по 100-200 мб до 3,5 гб. Если x86 версия дохла с OutOfMemory уже на 1,5 гб, то x64 версия доходит до 3,5 гб, и начинает "чудить" с памятью.

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

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

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

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


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