Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы с отслеживанием утечек памяти в приложениях с динамически загружаемыми плагинами в Delphi

Delphi , Файловая система , DLL и PlugIns

Вопрос отслеживания утечек памяти является актуальным для разработчиков, работающих с большими и сложными проектами. Особенно это касается приложений, которые используют динамически загружаемые библиотеки (DLL), компилируемые в среде Delphi. Одним из популярных инструментов для отслеживания утечек памяти является FastMM, который может быть дополнен информацией отладки JCL для более глубокого анализа.

Проблема

Разработчик столкнулся с проблемой, когда при использовании FastMM вместе с информацией отладки JCL для трассировки утечек памяти в приложении, отчеты об утечках содержали стек вызовов только для основного приложения. В случае утечек памяти, происходящих в динамически загружаемых плагинах, стек вызовов указывал на процедуру загрузки плагинов в основном приложении. При этом в двоичные файлы DLL были включены данные отладки JCL.

Возможные причины

Проблема могла быть связана с использованием общих runtime пакетов или с неправильной настройкой определенных переключателей (define).

Альтернативный ответ

В качестве альтернативного ответа было предложено проверить настройки FullDebugMode, опции совместного использования менеджера памяти (ShareMM и следующие) в файле FastMM4Options.inc, а также убедиться, что компиляция производится с включенной отладочной информацией.

Подтвержденный ответ

Автор FastMM, Пьер Лебланк, предоставил решение проблемы. Он рекомендовал не выгружать плагины при закрытии приложения, чтобы сохранить доступ к стекам вызовов и типам объектов. Однако это привело к множеству ошибок при закрытии, так как FastMM выгружался дважды. В итоге разработчику пришлось переместить FastMM в общий пакет.

Рекомендации

Для использования FastMM с пакетами полезно использовать опцию borlandmm.dll. Это может помочь избежать проблем, связанных с двойной выгрузкой менеджера памяти.

Решение проблемы в использовании

Следует обратить внимание на следующие шаги для корректной работы FastMM с динамически загружаемыми плагинами:

  1. Убедиться, что плагины и основное приложение используют общий пакет FastMM.
  2. Включить отладочную информацию при компиляции всех компонентов проекта.
  3. Настроить параметры FullDebugMode и ShareMM в файле FastMM4Options.inc.
  4. Использовать borlandmm.dll для интеграции FastMM с пакетами.

Пример кода

Вот пример кода, который может быть включен в FastMM4Options.inc для настройки совместного использования менеджера памяти:

```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
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 10:56:02/0.001986026763916/0