Depurar una fuga de memoria no administrada de dotnet con LLDB en Linux.
Tengo una aplicación cuyo consumo de memoria aumenta lentamente pero de manera continua. Un panel que construí con contadores de eventos y Grafana muestra que el tamaño del heap, el tamaño de gen[0-1-2], el tamaño de loh, el tamaño de poh, el recuento de ensamblados y los bytes jitted son constantes, pero el conjunto de trabajo sigue creciendo. Llega a 5Gb en una semana, a pesar de que el heap de la aplicación solo usa 2Gb.
He verificado con el comando free
y solo había ~700Mb en buffer.
Sé cómo usar dotnet-dump
y lldb
para depurar una fuga de memoria administrada, pero no sé cómo depurar una fuga de memoria no administrada. Toda la información que encuentro es sobre WinDbg y el comando heap
, el cual no tengo en lldb
. ¿Cómo debo proceder?
davy.ai
Como experto en IT especializado en Linux, .net-core, memoria, fugas de memoria y lldb, es importante seguir ciertos pasos para depurar una fuga de memoria no administrada. Aquí hay algunas recomendaciones:
El primer paso es identificar el tipo de fuga. Es muy probable que la fuga sea una fuga de memoria no administrada, ya que el tamaño del montón administrado es constante.
Usar el comando
lsof
:El siguiente paso es usar el comando
lsof
para descubrir qué archivos están abiertos y qué procesos los están utilizando. Esto puede ayudar a reducir la causa potencial de la fuga.Verificar la memoria del sistema:
También es importante verificar el uso de memoria del sistema para asegurarse de que la fuga no se debe a que el sistema pagine otros procesos debido a la falta de memoria.
Usar
Valgrind
:Valgrind
es una herramienta que puede ayudar a identificar fugas de memoria en programas C/C++. Se puede utilizar para detectar problemas como uso después de liberado, referencias nulas y más.Analizar con
lldb
:Si la fuga aún no se ha identificado, entonces se puede usar
lldb
para analizar el volcado de memoria principal. Usar el comandomemory regions
enlldb
para obtener la lista de regiones del proceso. Esto puede ayudar a identificar la región con el uso creciente de memoria.Analizar con
strace
:strace
también se puede utilizar para monitorear las llamadas al sistema realizadas por un proceso. Esto puede ayudar a identificar descriptores de archivos que no se cierran u otras llamadas al sistema que podrían indicar la fuente de la fuga.Usar el comando
nm
:El comando
nm
puede ayudar a identificar las funciones en el binario y sus direcciones. Esto puede ayudar a identificar posibles fugas de memoria causadas por funciones que asignan memoria pero nunca la liberan.En resumen, es esencial recopilar la mayor cantidad de información posible sobre la aplicación y monitorear los recursos del sistema para identificar la fuente de la fuga. Aunque
lldb
no tiene un comandoheap
, otras herramientas pueden ayudar a identificar y depurar fugas de memoria no administrada.