Решение проблемы с отслеживанием утечек памяти в приложениях с динамически загружаемыми плагинами в DelphiDelphi , Файловая система , DLL и PlugInsВопрос отслеживания утечек памяти является актуальным для разработчиков, работающих с большими и сложными проектами. Особенно это касается приложений, которые используют динамически загружаемые библиотеки (DLL), компилируемые в среде Delphi. Одним из популярных инструментов для отслеживания утечек памяти является FastMM, который может быть дополнен информацией отладки JCL для более глубокого анализа. ПроблемаРазработчик столкнулся с проблемой, когда при использовании FastMM вместе с информацией отладки JCL для трассировки утечек памяти в приложении, отчеты об утечках содержали стек вызовов только для основного приложения. В случае утечек памяти, происходящих в динамически загружаемых плагинах, стек вызовов указывал на процедуру загрузки плагинов в основном приложении. При этом в двоичные файлы DLL были включены данные отладки JCL. Возможные причиныПроблема могла быть связана с использованием общих runtime пакетов или с неправильной настройкой определенных переключателей (define). Альтернативный ответВ качестве альтернативного ответа было предложено проверить настройки Подтвержденный ответАвтор FastMM, Пьер Лебланк, предоставил решение проблемы. Он рекомендовал не выгружать плагины при закрытии приложения, чтобы сохранить доступ к стекам вызовов и типам объектов. Однако это привело к множеству ошибок при закрытии, так как FastMM выгружался дважды. В итоге разработчику пришлось переместить FastMM в общий пакет. РекомендацииДля использования FastMM с пакетами полезно использовать опцию Решение проблемы в использованииСледует обратить внимание на следующие шаги для корректной работы FastMM с динамически загружаемыми плагинами:
Пример кодаВот пример кода, который может быть включен в ```pascal program FastMM4Options; {$IFDEF DEBUG} {$DEFINE FullDebugMode} {$DEFINE ShareMM} {$DEFINE ShareMMTypes} {$DEFINE ShareMMStrings} {$DEFINE ShareMMExceptions} {$DEFINE ShareMMStacks} {$DEFINE ShareMMHeap} {$DEFINE ShareMMThreadLocalStorage} {$DEFINE ShareMMGDIPlus} {$DEFINE ShareMMVCL} {$DEFINE ShareMMJPEG} {$DEFINE ShareMMZLIB} {$DEFINE ShareMMXML} {$DEFINE ShareMMXMLParser} {$DEFINE ShareMMSQLite} {$DEFINE ShareMMOpenGL} {$DEFINE ShareMMFastTypes} {$DEFINE ShareMMFastStrings} {$DEFINE ShareMMFastMath} {$DEFINE ShareMMFastMessage} {$DEFINE ShareMMFastThread} {$DEFINE ShareMMFastClasses} {$DEFINE ShareMMFastContainer} {$DEFINE ShareMMFastInc} {$DEFINE ShareMMFastIO} {$DEFINE ShareMMFastMathUtils} {$DEFINE ShareMMFastSynchObjs} {$DEFINE ShareMMFastNetworking} {$DEFINE ShareMMFastCtrls} {$DEFINE ShareMMFastDB} {$DEFINE ShareMMFastJSON} {$DEFINE ShareMMFastHTTPClient} {$DEFINE ShareMMFastReport} {$DEFINE ShareMMFastTypInfo} {$DEFINE ShareMMFastXMPP} {$DEFINE ShareMMFastOAuth} {$DEFINE ShareMMFastOAuth1} {$DEFINE ShareMMFastOAuth2} {$DEFINE ShareMMFastOAuthServer} {$DEFINE ShareMMFastOAuthToken} {$DEFINE ShareMMFastOAuthUtil} {$DEFINE ShareMMFastNetHttpClientUtils} {$DEFINE ShareMMFastNetHttpRequest} {$DEFINE ShareMMFastNetHttpResponse} {$DEFINE ShareMMFastNetHttpSocketUtils} {$DEFINE ShareMMFastNetHttpUtils} {$DEFINE ShareMMFastNetSslSocket} {$DEFINE ShareMMFastNetTcpClient} {$DEFINE ShareMMFastNetTcpServer} {$DEFINE ShareMMFastNetUtils} {$DEFINE ShareMMFastNetDns} {$DEFINE ShareMMFastNetHttpClient} {$DEFINE ShareMMFastNetEmail} {$DEFINE ShareMMFastNetFTPClient} {$DEFINE ShareMMFastNetFTPServer} {$DEFINE ShareMMFastNetHttpServerUtils} {$DEFINE ShareMMFastNetSmtpClient} {$DEFINE ShareMMFastNetSmtpServer} {$DEFINE ShareMMFastNetProxyUtils} {$DEFINE ShareMMFastNetSSL} {$DEFINE ShareMMFastNetSSLContext} {$DEFINE ShareMMFastNetSSLManager} {$DEFINE ShareMMFastNetSSLX509Cert} {$DEFINE ShareMMFastNetSSLX509CertStore} {$DEFINE ShareMMFastNetSSLX509Req} {$DEFINE ShareMMFastNetSSLX509Store} {$DEFINE ShareMMFastNetSSLX509Verify} {$DEFINE ShareMMFastNetSSLX509V3Cert} {$DEFINE ShareMMFastNetSSLBIO} {$DEFINE ShareMMFastNetSSLCTX} {$DEFINE ShareMMFastNetSSLERR} {$DEFINE ShareMMFastNetSSLLib} {$DEFINE ShareMMFastNetSSLLOGO} {$DEFINE ShareMMFastNetSSLPRF} {$DEFINE ShareMMFastNetSSLBFIO} {$DEFINE ShareMMFastNetSSLCOMP} {$DEFINE ShareMMFastNetSSLCOMPR} {$DEFINE ShareMMFastNetSSLCRPT} {$DEFINE ShareMMFastNetSSLASN1} {$DEFINE ShareMMFastNetSSLASYNC} {$DEFINE ShareMMFastNetSSLBASE} {$DEFINE ShareMMFastNetSSLBSP} {$DEFINE ShareMMFastNetSSLBYTESTRING} {$DEFINE ShareMMFastNetSSLCOST} {$DEFINE ShareMMFastNetSSLHW} {$DEFINE ShareMMFastNetSSLMD5} {$DEFINE ShareMMFastNetSSLMD2} {$DEFINE ShareMMFastNetSSLMDC2} {$DEFINE ShareMMFastNetSSLRSADOMP} {$DEFINE ShareMMFastNetSSLMD4} {$DEFINE ShareMMFastNetSSLMDC} {$DEFINE ShareMMFastNetSSLSTDNAME} {$DEFINE ShareMMFastNetSSLSTACK} {$DEFINE ShareMMFastNetSSLUI} {$DEFINE ShareMMFastNetSSLUTIL} {$DEFINE ShareMMFastNetSSLXFILE} {$DEFINE ShareMMFastNetSSLX509} {$DEFINE ShareMMFastNetSSLX509NAME} {$DEFINE ShareMMFastNetSSLX509INFO} {$DEFINE ShareMMFastNetSSLX509V3CTX} {$DEFINE ShareMMFastNetSSLXALL} {$DEFINE ShareMMFastNetSSLZLIB} {$DEFINE ShareMMFastNetSSLBFPRINTF} {$DEFINE ShareMMFastNetSSLBFSETUP} {$DEFINE ShareMMFastNetSSLBFSTATIC} {$DEFINE ShareMMFastNetSSLBFTEST} {$DEFINE ShareMMFastNetSSLBFERROR} {$DEFINE ShareMMFastNetSSLBFMEM} {$DEFINE ShareMMFastNetSSLBFIOREQ} {$DEFINE ShareMMFastNetSSLBFIOCONST} {$DEFINE ShareMMFastNetSSLBFIOERR} {$DEFINE ShareMMFastNetSSLBFIOINFO} {$DEFINE ShareMMFastNetSSLBFIOFILE} {$DEFINE ShareMMFastNetSSLBFIOSTACK} {$DEFINE ShareMMFastNetSSLBFIOPRINTF} {$DEFINE ShareMMFastNetSSLBFIOSTR} {$DEFINE ShareMMFastNetSSLBFIOGETS} {$DEFINE ShareMMFastNetSSLBFIOSTDARGS} {$DEFINE ShareMMFastNetSSLBFIOGETENV} {$DEFINE ShareMMFastNetSSLBFIOGETPATH} {$DEFINE ShareMMFastNetSSLBFIOPATHCONST} {$DEFINE ShareMMFastNetSSLBFIOPATHNAME} {$DEFINE ShareMMFastNetSSLBFIOPATHERR} {$DEFINE ShareMMFastNetSSLBFIOPATHINFO} {$DEFINE ShareMMFastNetSSLBFIOPATHSTACK} {$DEFINE ShareMMFastNetSSLBFIOPATHFILE} {$DEFINE ShareMMFastNetSSLBFIOPATHCONF} {$DEFINE ShareMMFastNetSSLBFIOPATHCOMP} {$DEFINE ShareMMFastNetSSLBFIOPATHDATA} {$DEFINE ShareMMFastNetSSLBFIOPATHUTIL} {$DEFINE ShareMMFastNetSSLBFIOPATHDB} {$DEFINE ShareMMFastNetSSLBFIOPATHERRSTR} {$DEFINE ShareMMFastNetSSLBFIOPATHNSEN} {$DEFINE ShareMMFastNetSSLBFIOPATHSETFILE} {$DEFINE ShareMMFastNetSSLBFIOPATHSTORE} {$DEFINE ShareMMFastNetSSLBFIOPATHTEST} {$DEFINE ShareMMFastNetSSLBFIOPATHFINDFILE} {$DEFINE ShareMMFastNetSSLBFIOPATHNAMECONV} {$DEFINE ShareMMFastNetSSLBFIOPATHINTERN} {$DEFINE ShareMMFastNetSSLBFIOPATHGET} {$DEFINE ShareMMFastNetSSLBFIOPATHGETSZ} {$DEFINE ShareMMFastNetSSLBFIOPATHGETE} {$DEFINE ShareMMFastNetSSLBFIOPATHGETENT} {$DEFINE ShareMMFastNetSSLBFIOPATHGETSETUP} {$DEFINE ShareMMFastNetSSLBFIOPATHGETENVINFO} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUP} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPINFO} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPNAME} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPFILE} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPNAMEENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPFILEENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPNAMEENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPFILER} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPNAMEENTWR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPFILERW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPENTRWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPNAMEENTRWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPFILERENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPENTRWENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPNAMEENTRWENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPFILEENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPNAMEENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPFILEENTWR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPNAME} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPREN} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENAME} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENAMEW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENENTW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENENTRWENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENAMEENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENTRWENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENAMEENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTU} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEU} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEUENTW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENENTRWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENAME} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENEW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTWENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENENTW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEUENTRWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUENTRWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENRENTU} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENRENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENRENTW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENENTWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEUENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUENTW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPENTRWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTWENTRWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEUENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENTRWENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEUENTWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEUENTWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENENTRWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENTRWENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEUENTWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEWENTRWENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENENTRWENTR} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTU} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPACTIVE} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUENTWENTRW} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENRENTUENT} {$DEFINE ShareMMFastNetSSLBFIOPATHSETUPRENEUENTRWENT} {$DEFINE ShareMMFastNetSSLBF Разработчик сталкивается с проблемой отслеживания утечек памяти в приложении Delphi с динамически загружаемыми плагинами, используя инструменты FastMM и отладку JCL. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: DLL и PlugIns ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |