Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Liberar recursos en tiempo de ejecución

Estas en el tema de Liberar recursos en tiempo de ejecución en el foro de C/C++ en Foros del Web. Hola de nuevo publico este hilo por que tengo un problema que no he podido solucionar y en verdad lo he intentado pero no doy ...
  #1 (permalink)  
Antiguo 01/08/2013, 20:06
 
Fecha de Ingreso: mayo-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 0
Liberar recursos en tiempo de ejecución

Hola de nuevo publico este hilo por que tengo un problema que no he podido solucionar y en verdad lo he intentado pero no doy con la solucion.

Administro un pequeño servidor en el cual alojo programas desarrollados por mi en c ,los cuales en apariencia funciona bien pero hace 4 semanas aproximadamente note un problema al usar la funcion TOP y FREE de linux con las cuales detecte que todas mis aplicaciones despues de unas horas de uso empiesan a consumir memoria de una maner desproporcionada.

La aplicacion que me da mas dolores de cabeza .recien se inicia ocupa el 3% de la ram y depues de unas 8 horas de trabajo consume el 15% de esta lo cual me esta dando muchos problemas ya que es necesario cerrarla y abrirla para liberar los recursos.

entrar a explicar que hace es un poco extenso pero en general mediante timers acivo funciones cada cierto tiempo que usan variables locales en su mayoria y una que otra publica o global del tipo char buffer[2000];

Nunca hago uso de la funcion malloc ,new,delete o free que segun lei podian ser la causa del problema.

use una funcion para liberar cache pero no afecta a mis aplicaciones.
sudo sync && sudo sysctl -w vm.drop_caches=3

no tengo una formacion academica en programcion ,o es muy basica la mayoria de cosas que he creado han sido de manera empirica ..por lo cual supongo que debe haber algo que no estoy teniendo en cuanta a la hora de programar


Agradesco cualquier aporte.
  #2 (permalink)  
Antiguo 02/08/2013, 02:20
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Liberar recursos en tiempo de ejecución

Si no usas malloc, entonces debe ser culpa de alguna librería, en la cual tengas que ir liberando recursos cada vez que se utiliza 'X'.
  #3 (permalink)  
Antiguo 02/08/2013, 08:58
 
Fecha de Ingreso: mayo-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 0
Respuesta: Liberar recursos en tiempo de ejecución

Gracias amchacon por su colaboración...
en general uso librerías estándar de c que me imagino están optimizadas para evitar estos problemas ,sin embargo en el programa que me da mas problemas uso openssl ..alguien sabe si esta libreria tiene este tipo de problemas????


he leído sobre un programa llamado valgrind que ayuda con estos lios pero no lo comprendo muy bien ..yo uso codeblocks que trae integrado un modulo valgrind que nunca me muestra nada .alguien podría darme una pista de como usarlo en este ide??
  #4 (permalink)  
Antiguo 02/08/2013, 09:05
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Liberar recursos en tiempo de ejecución

Puedes usar valgrid para encontrar memory leaks que tengas en tu programa.

Otra cosa lo que describes que hace tu programa suena a lo que hace cron.
  #5 (permalink)  
Antiguo 03/08/2013, 07:56
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Liberar recursos en tiempo de ejecución

Cita:
Iniciado por williamfj Ver Mensaje
Gracias amchacon por su colaboración...
en general uso librerías estándar de c que me imagino están optimizadas para evitar estos problemas ,sin embargo en el programa que me da mas problemas uso openssl ..alguien sabe si esta libreria tiene este tipo de problemas????
No digo que las librerías den problemas, sino que no las usas correctamente.

Por ejemplo, suponte que usas una librería que tiene unas funciones para cargar una imagen:

Código C++:
Ver original
  1. cargar_bitmap();
  2.  
  3. // Usar imagen...
  4.  
  5.  
  6. // Ahora tendríamos que destruir la imagen, si no lo hicieramos tendríamos un memory leak
  7.  
  8. destroy_bitmap();

Extrapola este ejemplo a la librería que utilizes ;)
  #6 (permalink)  
Antiguo 07/08/2013, 11:45
 
Fecha de Ingreso: mayo-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 0
Respuesta: Liberar recursos en tiempo de ejecución

hola a todos gracias por su colaboracion . efectivamente los problemas que tengo se deben a no liberar recursos que usa la libreia openssl

ctx_t=SSL_CTX_new(SSLv23_client_method());
ssl_t=SSL_new(ctx_t);
SSL_set_fd(ssl_t, sock[35]);
mem_t = BIO_new_socket(sock[35], BIO_CLOSE);

la palabra NEW hace referencia a la reserva de memoria

en teoria los recursos se liberan con las siguientes lineas

BIO_reset(mem_t);
BIO_free_all(mem_t);
SSL_CTX_free(ctx_t);

pero esto no soluciono del todo el problema ...seguire buscando aunque estoy sopechando del uso de lo sockets normales ..

si logro solucionarlo compartire la info por aca pero es un tema algo confuso para mi.
  #7 (permalink)  
Antiguo 23/11/2014, 20:35
 
Fecha de Ingreso: mayo-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 0
Respuesta: Liberar recursos en tiempo de ejecución

Hola como han estado? ,estoy de vuelta por acá por que después de algo mas de un año encontré la solución a mi problema.

tuve la necesidad de migrar mi programa a consola debido a que cambie mi proveedor de VPS con la mala fortuna que este no admiten modo gráfico...me costo algo de trabajo pero lo logre solo para darme cuenta que mis problemas de fuga de memoria continuaban ,leí documentación sobre openssl pero no encontré nada así que recurrí a algo que en otras ocasiones me ha dado resultados prueba y error ...prueba y error hasta dar con algo útil. con lo cual encontré el problema después de muchas segmentaciones.


todos los ejemplos que encontré cerraban la conexión de la siguiente manera

BIO_reset(mem_t);
BIO_free_all(mem_t);
SSL_CTX_free(ctx_t);

lo cual parece que no es del todo correcto ya que para la conexión segura se requiere de una variable tipo SSL *myssl la cual en ningún momento se libera.

SSL_CTX_free(ctx_t);
SSL_FREE(myssl); ///aqui esta el detalle
close(sock);

según entendí de la documentación la instrucción SSL_FREE(ssl *) libera indirectamente los buffer BIO con lo cual se liberan todos los recursos que se usaron para realizar la conexión segura.

aun no marco el tema como solucionado esperando posibles aportes.

Etiquetas: funcion, int, liberar, programa, recursos, tiempo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:22.