Приложение по LoadLibrary() подгружает dll - ки, работает допустим с ними. Потом по FreeLibrary() выгружает их. Остается неосвобожденной (как по мне) некоторый объем памяти? Вот тестовый пример: Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib include \masm32\include\psapi.inc includelib \masm32\lib\psapi.lib .data PROCESS_MEMORY_COUNTERS STRUCT cb DWORD ? PageFaultCount DWORD ? PeakWorkingSetSize DWORD ? WorkingSetSize DWORD ? QuotaPeakPagedPoolUsage DWORD ? QuotaPagedPoolUsage DWORD ? QuotaPeakNonPagedPoolUsage DWORD ? QuotaNonPagedPoolUsage DWORD ? PagefileUsage DWORD ? PeakPagefileUsage DWORD ? PROCESS_MEMORY_COUNTERS ENDS pmc PROCESS_MEMORY_COUNTERS <> szlib00 db 'lib00.dll',0 szlib01 db 'lib01.dll',0 szlib02 db 'lib02.dll',0 hlib00 dd 0 hlib01 dd 0 hlib02 dd 0 hProcess dd 0 template db " Loading Plugin : %s",13,10,0 template1 db " UnLoading Plugin : %s",13,10,0 template2 db " Process use : %d byte",13,10,0 TextBuf db 100 dup( ? ) input_buffer db 2 dup(0) lf db 13,10,0 .code main: ;******************************************************************* invoke GetCurrentProcess mov hProcess, eax invoke StdOut,addr lf invoke GetProcessMemoryInfo, hProcess, ADDR pmc, SIZEOF pmc mov eax, pmc.WorkingSetSize invoke wsprintf,addr TextBuf,addr template2,eax invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke LoadLibrary,addr szlib00 mov hlib00,eax invoke wsprintf,addr TextBuf,addr template,addr szlib00 invoke StdOut,addr TextBuf invoke LoadLibrary,addr szlib01 mov hlib01,eax invoke wsprintf,addr TextBuf,addr template,addr szlib01 invoke StdOut,addr TextBuf invoke LoadLibrary,addr szlib02 mov hlib02,eax invoke wsprintf,addr TextBuf,addr template,addr szlib02 invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke GetProcessMemoryInfo, hProcess, ADDR pmc, SIZEOF pmc mov eax, pmc.WorkingSetSize invoke wsprintf,addr TextBuf,addr template2,eax invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke Sleep, 1000 invoke FreeLibrary,hlib02 invoke wsprintf,addr TextBuf,addr template1,addr szlib02 invoke StdOut,addr TextBuf invoke FreeLibrary,hlib01 invoke wsprintf,addr TextBuf,addr template1,addr szlib01 invoke StdOut,addr TextBuf invoke FreeLibrary,hlib00 invoke wsprintf,addr TextBuf,addr template1,addr szlib00 invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke GetProcessMemoryInfo, hProcess, ADDR pmc, SIZEOF pmc mov eax, pmc.WorkingSetSize invoke wsprintf,addr TextBuf,addr template2,eax invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke StdIn, addr input_buffer, 1 ;******************************************************************* invoke ExitProcess,0 end main Результат : Из картинки вопрос - где повисли 708608 - 684032 = 24576 byte?? Подскажите пожалуйста, может я чего накосячил. По выгрузке всех dll - вообще-то ожидалось объем занимаемой памяти = 684032 byte.
Так что значит есть такое, или я где-то тормознул? Вот код dll - лек, (все три одинаковые): Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib .data szlibName db 'MyFirstlib_01',0 szlibLoad db 'lib Rule!_01',0 szlibUnLoad db 'Later, Bye Bye_01',0 .code DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved:DWORD mov eax,TRUE ret DllEntry Endp ;-------------------------------------------------------------- Namez proc lea eax, szlibName ret Namez endp ;-------------------------------------------------------------- Load proc lea eax, szlibLoad ret Load endp ;-------------------------------------------------------------- Unload proc lea eax, szlibUnLoad ret Unload endp ;-------------------------------------------------------------- End DllEntry
Извини не понял, еще раз три строки с FreeLibruary() ? То есть Освободить либы замерять память и снова освободить либы? Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib include \masm32\include\psapi.inc includelib \masm32\lib\psapi.lib .data PROCESS_MEMORY_COUNTERS STRUCT cb DWORD ? PageFaultCount DWORD ? PeakWorkingSetSize DWORD ? WorkingSetSize DWORD ? QuotaPeakPagedPoolUsage DWORD ? QuotaPagedPoolUsage DWORD ? QuotaPeakNonPagedPoolUsage DWORD ? QuotaNonPagedPoolUsage DWORD ? PagefileUsage DWORD ? PeakPagefileUsage DWORD ? PROCESS_MEMORY_COUNTERS ENDS pmc PROCESS_MEMORY_COUNTERS <> szlib00 db 'lib00.dll',0 szlib01 db 'lib01.dll',0 szlib02 db 'lib02.dll',0 hlib00 dd 0 hlib01 dd 0 hlib02 dd 0 hProcess dd 0 template db " Loading Libs : %s",13,10,0 template1 db " UnLoading Libs : %s",13,10,0 template2 db " Process use : %d byte",13,10,0 template3 db " Second Libs UnLoading : %s",13,10,0 TextBuf db 100 dup( ? ) input_buffer db 2 dup(0) lf db 13,10,0 .code main: ;******************************************************************* invoke GetCurrentProcess mov hProcess, eax invoke StdOut,addr lf invoke GetProcessMemoryInfo, hProcess, ADDR pmc, SIZEOF pmc mov eax, pmc.WorkingSetSize invoke wsprintf,addr TextBuf,addr template2,eax invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke LoadLibrary,addr szlib00 mov hlib00,eax invoke wsprintf,addr TextBuf,addr template,addr szlib00 invoke StdOut,addr TextBuf invoke LoadLibrary,addr szlib01 mov hlib01,eax invoke wsprintf,addr TextBuf,addr template,addr szlib01 invoke StdOut,addr TextBuf invoke LoadLibrary,addr szlib02 mov hlib02,eax invoke wsprintf,addr TextBuf,addr template,addr szlib02 invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke GetProcessMemoryInfo, hProcess, ADDR pmc, SIZEOF pmc mov eax, pmc.WorkingSetSize invoke wsprintf,addr TextBuf,addr template2,eax invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke Sleep, 1000 invoke FreeLibrary,hlib02 invoke wsprintf,addr TextBuf,addr template1,addr szlib02 invoke StdOut,addr TextBuf invoke FreeLibrary,hlib01 invoke wsprintf,addr TextBuf,addr template1,addr szlib01 invoke StdOut,addr TextBuf invoke FreeLibrary,hlib00 invoke wsprintf,addr TextBuf,addr template1,addr szlib00 invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke GetProcessMemoryInfo, hProcess, ADDR pmc, SIZEOF pmc mov eax, pmc.WorkingSetSize invoke wsprintf,addr TextBuf,addr template2,eax invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke Sleep, 1000 invoke FreeLibrary,hlib02 invoke wsprintf,addr TextBuf,addr template3,addr szlib02 invoke StdOut,addr TextBuf invoke FreeLibrary,hlib01 invoke wsprintf,addr TextBuf,addr template3,addr szlib01 invoke StdOut,addr TextBuf invoke FreeLibrary,hlib00 invoke wsprintf,addr TextBuf,addr template3,addr szlib00 invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke GetProcessMemoryInfo, hProcess, ADDR pmc, SIZEOF pmc mov eax, pmc.WorkingSetSize invoke wsprintf,addr TextBuf,addr template2,eax invoke StdOut,addr TextBuf invoke StdOut,addr lf invoke StdIn, addr input_buffer, 1 ;******************************************************************* invoke ExitProcess,0 end main Вот:
_sheva740 Не так) Добавь не только FreeLibruary, а ещё и LoadLibrary. ЗЫ. Из консоли можно текст копировать в буфер обмена (правая кнопа).
Жалких 6 страничек - да где угодно, в "недрах системы" WorkingSetSize это вообще фикция, на которую не стоит обращать внимания. Вызови EmptyWorkingSet или SetProcessWorkingSetSize(...,-1,-1) и будет тебе счастие
_sheva740 Мне не понятно для чАво вам проверять самого себя на ошибки, коли пишите на асме? Переходите на C/C++/Delphi и юзайте манагеры памяти, которые всё расскажут вам.
По поводу FreeLibrary, она не выгружает dll, а только уменьшает счетчик ссылок на библиотеку, если их не остается то библиотека выгружается системой. Поэтому не обязательно что библиотека будет выгружена из памяти.
В данном случае dll "выгружаются" - на картинке #7 видно, что после FreeLibrary раб.набор уменьшается, но не до исходного значения, т.к. помимо образов самих dll при их загрузке система может выделять доп.память на всякую обслугу (например, под таблицы страниц, Ldr-инфу о загруженных модулях и т.п.). Эти служебные страницы ес-но тоже включаются в WorkingSetSize (как общее кол-во физ.памяти, используемой процессом в наст.момент). Однако если физ.памяти достаточно, то хитрая винда может и не спешить их исключать\удалять из процесса в надежде, что они могут понадобиться в дальнейшем. К тому же при загрузке и инициализации одних dll может произойти подкачка\маппинг страниц других dll - системных, и эти ранее ни используемые страницы ес-но так и останутся в раб.наборе. И т.д. и т.п. Одним словом - такая "ветренная" штука как кол-во страниц физ.памяти, замапленных сиеминутно в процесс, никак не может служить хар-кой утечек\неутечек памяти (по вине программера).
Ну как "чАво" ))) надо же рачительно относиться к ресурсам ))) Дело в том что в данном случае как раз предпринимается попытка переписать код с С++ на asm. Подскажите пожалуйста направление или апишки чтобы определять эти утечки. У меня на пример выше Deleaker Standalone Version 2.2.7.0 вообще не отреагировал. Или единственно здравый подход тут - "махнуть рукой" и не заморачиваться?