powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Простейший менеджер памяти на базе VirtualAlloc
25 сообщений из 90, страница 2 из 4
Простейший менеджер памяти на базе VirtualAlloc
    #40136703
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наталья87
Цель именно в том, чтобы ошибки в программе не приводили к повреждению памяти, последующим глюкам а то и падению приложения (у клиентов на Release-сборке)

Для того, чтобы ошибки в программе не приводили к таким последствиям у клиентов на release-сборке, их нужно отлавливать и исправлять до этого момента. Соответствующий процесс называется тестированием и отладкой. Пытаться микшировать такие проблемы у клиентов - это примерно как лечить мёртвого припарками.
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136704
Наталья87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Наталья87
Цель именно в том, чтобы ошибки в программе не приводили к повреждению памяти, последующим глюкам а то и падению приложения (у клиентов на Release-сборке)

Для того, чтобы ошибки в программе не приводили к таким последствиям у клиентов на release-сборке, их нужно отлавливать и исправлять до этого момента. Соответствующий процесс называется тестированием и отладкой. Пытаться микшировать такие проблемы у клиентов - это примерно как лечить мёртвого припарками.


Так оно делается, ошибки периодически отлавливаются и фиксятся. Но к сожалению, не получается исправить их все. А клиенты жалуются, что ПО периодически (например, раз в неделю, что фиг отловишь) глючит и вылетает.

Приложение состоит из 500 000 строк кода, найти что именно глючит и портит память не получается. Ставить Release-сборки с SafeMM тоже по причине замедления работы ПО в несколько раз. Поэтому и хочется понять, что можно сделать кроме Range Check и Overflow Check - чтобы защитить память - но сильно при этом не замедлить программу.
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136706
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наталья87
Поэтому и хочется понять, что можно сделать кроме Range Check и Overflow Check - чтобы защитить память - но сильно при этом не замедлить программу.
имхо, тут программист нужен! ©
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136711
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПриложение состоит из 500 000 строк кода, найти что именно глючит и портит память не получается. Ставить Release-сборки с SafeMM тоже по причине замедления работы ПО в несколько раз. Поэтому и хочется понять, что можно сделать кроме Range Check и Overflow Check - чтобы защитить память - но сильно при этом не замедлить программу.

Для начала организовать показ стека в сообщении об ошибках
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136713
Наталья87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmoker

Если вы хотите смотреть за потреблением памяти вашей программы, то в диспетчере задач выберите Вид / Выбрать столбцы и поставьте галку на "Объём виртуальной памяти".


Увы, но при использовании VirtualAlloc-менеджера с блоками, кратными 4 Кб на каждый чих - в колонке "Виртуальная память" показывает также всего примерно 150 Мб - хотя память уже закончилась и вовсю сыпется "Out of memory".

Но вот если выделять блоками не по 4 Кб, а по 64 Кб - как и предполагалось, момент "Out of memory" наступает примерно при тех же условиях (не раньше и не позже), но зато в колонке "Виртуальная память" показывает реально потребляемый объем (ну или близко к тому).

В общем, с VirtualAlloc эксперименты закончились. Осталось понять, как защитить память на Release-сборках от глюков в программе и от случайных ошибок и падений ПО примерно раз в неделю.
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136715
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наталья87Осталось понять, как защитить память на Release-сборках от глюков в программе и
от случайных ошибок и падений ПО примерно раз в неделю.

Обычно для этого используют code review и уже названные дампы падения, но в
вашем случае это бесперспективняк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136719
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наталья87
Увы, но при использовании VirtualAlloc-менеджера с блоками, кратными 4 Кб на каждый чих - в колонке "Виртуальная память" показывает также всего примерно 150 Мб - хотя память уже закончилась и вовсю сыпется "Out of memory".

Kazantsev Alexey
Это называется фрагментацией адресного пространства.

Когда вы выделяете только 4 кб, то выделяется ровно одна страница памяти (4 кб), но память с 5-го по 64 кб оказывается недоступной (unused), поскольку следующий блок можно выделить только начиная с 64-го кб.

Изучать раскладку памяти приложения можно с помощью VMMap .
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136730
Наталья87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По итогу - в попытках имитировать ошибки в программе, обращаясь к случайным адресам памяти и записывая туда какие-либо значения - лучше всего показал SafeMM, героически отражая атаки, с ним дольше всего программа не падала.

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

Хорош, получается, SafeMM - но медленный. Вот бы его как-нибудь ускорить ...
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136736
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сама тема невероятно удивительная. Попытка укрепить изделие из.... и палок, намазав побольше ..... Для начала надо выяснить причины падения (емли их много) то самую частую и устранить. Мой хрустальный шар говорит мне что большая часть программы - копипаст. Это означает, что ошибку во множестве мест можно будет починить автозаменой. Но тут конечно программист нужен
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136742
Наталья87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Michael Longneck
Для начала надо выяснить причины падения (емли их много) то самую частую и устранить


Так вот никак не получается уже больше, чем полгода. Падает редко - поэтому сложно отловить и устранить.

Поэтому и возникает идея, как защитить память, не снизив при этом сильно скорость программы. Потому что пользователям нужен стабильный продукт уже сейчас, а не в далеком будущем, когда баги будут устранены.
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136747
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckСама тема невероятно удивительная. Попытка укрепить изделие из.... и палок,
намазав побольше .....

Как и любая другая тема данного топикстартера. "Фирменный стиль", так сказать...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136748
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наталья87
Так вот никак не получается уже больше, чем полгода.

Вам уже не раз сказали: для этого нужен программист. Нужно организовать нормальный процесс тестирования. Сделать хотя бы пару десятков сценариев основных операций и гонять их по кругу в тестовой версии, реагируя на замеченные дефекты работы с памятью. Ещё было бы очень нехило, чтобы программист сделал поверхностный code review этим страшным и ужасным 500.000 строк - довольно вероятно, что он ткнёт пальцем со словами "вот это хреновая практика, надо переделать везде". И в целом я примерно на 99% уверен, что если бы полгода назад программист взялся бы за эту работу - то сейчас в приложении вместо 500.000 глючащих строк было бы 200.000 отлаженных.
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136767
Наталья87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Наталья87
Так вот никак не получается уже больше, чем полгода.

Вам уже не раз сказали: для этого нужен программист. Нужно организовать нормальный процесс тестирования. Сделать хотя бы пару десятков сценариев основных операций и гонять их по кругу в тестовой версии, реагируя на замеченные дефекты работы с памятью. Ещё было бы очень нехило, чтобы программист сделал поверхностный code review этим страшным и ужасным 500.000 строк - довольно вероятно, что он ткнёт пальцем со словами "вот это хреновая практика, надо переделать везде". И в целом я примерно на 99% уверен, что если бы полгода назад программист взялся бы за эту работу - то сейчас в приложении вместо 500.000 глючащих строк было бы 200.000 отлаженных.


Проблема еще в том, что приложение до этого работало почти 10 лет - и немного подглючивало - но терпимо и в рамках нормы. А в последнее время ошибки памяти и вылеты приняли какой-то прямо зверский вид, вылетать и глючить стало чаще, даже старый функционал, который вроде бы не менялся. Причем непонятно, в какой версии это началось, все происходило как-то постепенно.
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136772
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более того, эту закономерность можно проследить из Ваших топиков с примерами
кода. Особенно с дикими костылями, которые как раз изменяют поведение старого
кода лишь бы его не править. О чём вам каждый раз говорят. Но продолжайте стоять
на своём, это даже любопытно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136775
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторнемного подглючивало - но терпимо и в рамках нормы
в мемориз
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136779
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наталья87

Проблема еще в том, что приложение до этого работало почти 10 лет - и немного подглючивало - но терпимо и в рамках нормы. А в последнее время ошибки памяти и вылеты приняли какой-то прямо зверский вид, вылетать и глючить стало чаще, даже старый функционал, который вроде бы не менялся. Причем непонятно, в какой версии это началось, все происходило как-то постепенно.


Боюсь спросить - в пределах нормы - это как? Что вы там такое считаете, что вам память вагонами нужна? Возможно стоит поменять подход и крутить расчеты НЕ выделяя дополнительную память, а переиспользуя выделенную?
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136788
Наталья87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster
Наталья87

Проблема еще в том, что приложение до этого работало почти 10 лет - и немного подглючивало - но терпимо и в рамках нормы. А в последнее время ошибки памяти и вылеты приняли какой-то прямо зверский вид, вылетать и глючить стало чаще, даже старый функционал, который вроде бы не менялся. Причем непонятно, в какой версии это началось, все происходило как-то постепенно.


Боюсь спросить - в пределах нормы - это как?


Ну если, например, вылетает раз в полгода, глючит иногда. У 5% пользователей. То в пределах нормы. А в последнее время прямо вал обращений - программа глючит, падает раз в неделю, причем чуть ли не у половины пользователей. И фиг знает, в чем там может быть дело. Некоторые просят перехода на старую версию.
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136789
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наталья87,

предлагаю ход конём: при падении перезапускать приложение. Майкрософт так и делает.
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136801
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше Windows перезапускать
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136802
Наталья87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот мой защищенный менеджер памяти. Защищен от случайных промахов за границы массивов. Правда, не защищен от обращения по старым ссылкам ранее выделенной памяти. Будем надеяться этого совместно с 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.
UNIT NatalyMM;
INTERFACE
USES Windows;
IMPLEMENTATION
type
   TMInteger = Integer;
   SIZE_T = Integer;
var
   gHeap: THandle;
const
   Protector0 = 1.3; {выделяем памяти в несколько раз больше, чем нужно}
   Protector1 = 64; {резервируем это количество байт до выделяемого участка}
   Protector2 = 128; {резервируем это количество байт после выделяемого участка}

procedure GetMMAndSize(DataPtr: integer; var MM, size: integer);
begin
   MM := DataPtr-Protector1;
   size := HeapSize(gHeap, 0, pointer(MM));
end;

function NewGetMem(DataSize: integer): Pointer;
var
   MM: integer;
begin
   if DataSize<=0 then begin
      result := nil;
      Exit;
   end;

   {обернем все слоем ваты}
   MM := integer(HeapAlloc(gHeap, 0, round(Protector0*DataSize) + Protector1 + Protector2));
   result := pointer(MM+Protector1);
end;

function NewFreeMem(DataPtr: Pointer): Integer;
var
   MM, size: integer;
begin
   if DataPtr=nil then begin
      Result := 0;
      Exit;
   end;

   GetMMAndSize(integer(DataPtr), MM, Size);

   HeapFree(gHeap, 0, pointer(MM));
   result := 0;
end;

function NewReallocMem(DataPtr: Pointer; DataSize: integer): pointer;
var
   MM, size: integer;
begin
   if (DataPtr=nil) or (DataSize<=0) then begin
      Result := nil;
      Exit;
   end;

   GetMMAndSize(integer(DataPtr), MM, size);

   MM := integer(HeapRealloc(gHeap, 0, pointer(MM), round(Protector0*DataSize) + Protector1 + Protector2));
   result := pointer(integer(MM)+Protector1);
end;

const
   HeapCompatibilityInformation = 0;
   HeapEnableTerminationOnCorruption = 1;
   HEAP_LFH = 2;
var
   HeapSetInformation: function(
      HeapHandle: THandle;
      HeapInformationClass: ULONG;
      HeapInformation: pointer;
      HeapInformationLength: SIZE_T
   ): BOOL; stdcall;

procedure InitLowFragmentationHeap(AHeap :THandle);
var
   vModule: HMODULE;
   vHeapInformation :ULONG;
begin
   vModule := GetModuleHandle(kernel32);
   if vModule<>0 then
      @HeapSetInformation := GetProcAddress(vModule, 'HeapSetInformation');
   if Assigned(HeapSetInformation) then begin
      vHeapInformation := HEAP_LFH;
      HeapSetInformation(AHeap, HeapCompatibilityInformation, @vHeapInformation, SizeOf(vHeapInformation));
   end;
end;

const
   DebugMemMgr: TMemoryManager = (
      GetMem    : NewGetMem;
      FreeMem   : NewFreeMem;
      ReallocMem: NewReallocMem
   );
var
   OldMemMgr: TMemoryManager;
   ManagerInstalled: Boolean = False;

procedure InstallMemoryManager;
begin
   if not ManagerInstalled then begin
      GetMemoryManager(OldMemMgr);
      SetMemoryManager(DebugMemMgr);
      gHeap := GetProcessHeap;
      InitLowFragmentationHeap(gHeap);
      ManagerInstalled := True;
   end;
end;

procedure DeinstallMemoryDebugManager;
begin
   if ManagerInstalled then begin
      SetMemoryManager(OldMemMgr);
      ManagerInstalled := False;
   end;
end;

INITIALIZATION
   InstallMemoryManager;
FINALIZATION
   DeinstallMemoryDebugManager;
END.
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136803
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
500 тысяч строк - это не очень много...
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136814
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наталья87
По итогу - в попытках имитировать ошибки в программе, обращаясь к случайным адресам памяти и записывая туда какие-либо значения - лучше всего показал SafeMM, героически отражая атаки, с ним дольше всего программа не падала.

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

Хорош, получается, SafeMM - но медленный. Вот бы его как-нибудь ускорить ...
Я вам удивительную вещь скажу:
"SafeMM нельзя использовать в релизе, только в отладке, для поиска ошибок доступа к памяти"
Это его основная фича

Он запросто может всю память сожрать и приложение упадёт.
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136821
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
и приложение упадёт.

это терпимо и в рамках нормы (с)
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136833
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

Тут как бы в идеале для ТС: разобраться зачем нужен SafeMM(как он работает) и пофиксить баги, а не героически отражать атаки отладочным инструментом
...
Рейтинг: 0 / 0
Простейший менеджер памяти на базе VirtualAlloc
    #40136841
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Справедливости ради, вполне возможно, что ресурсов фиксить баги нет, а рабочий релиз нужен вотпрямщас. При этом падения с описанной частотой приемлемы.
...
Рейтинг: 0 / 0
25 сообщений из 90, страница 2 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Простейший менеджер памяти на базе VirtualAlloc
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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