Quien sabe como generar informe del estado de la memoria...

Post Reply
xmanuel
Posts: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Quien sabe como generar informe del estado de la memoria...

Post by xmanuel »

Pues eso, qué es lo que hay que hacer para que cuando no se libera memoria reservada previamente, el programa EXE genere un fichero "hb_out.log" con el informe del estado de la memoria
:shock: :lol:

Gracias compañeros!!!
______________________________________________________________________________
Sevilla - Andalucía
User avatar
Antonio Linares
Site Admin
Posts: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Re: Quien sabe como generar informe del estado de la memoria...

Post by Antonio Linares »

Manuel,

Y como estas reservando esa memoria previamente ?

hb_xgrab() ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
xmanuel
Posts: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Re: Quien sabe como generar informe del estado de la memoria...

Post by xmanuel »

Si con hb_xgrab() :D
______________________________________________________________________________
Sevilla - Andalucía
User avatar
Antonio Linares
Site Admin
Posts: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Re: Quien sabe como generar informe del estado de la memoria...

Post by Antonio Linares »

En principio todo lo que tienes que hacer es llamar a hb_xfree( ... ) cuando ya no necesites esa memoria.

Se puede construir un Harbour con control de memoria usando unos determinados flags,
pero es más lento que sin ellos.
regards, saludos

Antonio Linares
www.fivetechsoft.com
xmanuel
Posts: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Re: Quien sabe como generar informe del estado de la memoria...

Post by xmanuel »

Jajaja ya eso lo sé Antonio...
El tema es controlar que no me he saltado ningún hb_xfree( ... ) sin querer o ningún itemRelease( ... )

Y esto es en fase de desarrollo así que me da igual que vaya lento...

Estoy desarrollando un LIB para acceso a bases de datos con clases hechas en C completamente.
La verdad es que me va quedando muy bien. Con el preprocesador de C he conseguido facilitar el desarrollo...
Mira este ejemplo:

Code: Select all | Expand



CREATE_CLASS( "THASHCURSOR", THASHCURSOR, THASHCURSOR_IVARCOUNT )

    /* Metodos */
    METHOD( "NEW",          THASHCURSOR_NEW )
    METHOD( "GETCURSOR",    THASHCURSOR_GETCURSOR )
    METHOD( "SETCURSOR",    THASHCURSOR_SETCURSOR )
    METHOD( "RECNO",        THASHCURSOR_RECNO )
    METHOD( "RECCOUNT",     THASHCURSOR_RECCOUNT )
    METHOD( "GOTO",         THASHCURSOR_GOTO )
    METHOD( "GOTOP",        THASHCURSOR_GOTOP )
    METHOD( "GOBOTTOM",     THASHCURSOR_GOBOTTOM )
    METHOD( "SKIP",         THASHCURSOR_SKIP )
    METHOD( "SKIPPER",      THASHCURSOR_SKIPPER )
    METHOD( "NEXT",         THASHCURSOR_NEXT )
    METHOD( "PRIOR",        THASHCURSOR_PRIOR )
    METHOD( "EOF",          THASHCURSOR_EOF )
    METHOD( "BOF",          THASHCURSOR_BOF )
    METHOD( "FIELDCOUNT",   THASHCURSOR_FIELDCOUNT )
    METHOD( "FIELDGET",     THASHCURSOR_FIELDGET )
    METHOD( "GETBYNAME",    THASHCURSOR_GETBYNAME )
    METHOD( "FIELDNAME",    THASHCURSOR_FIELDNAME )
    METHOD( "FIELDLEN",     THASHCURSOR_FIELDLEN )
    METHOD( "FIELDTYPE",    THASHCURSOR_FIELDTYPE )
    METHOD( "SCAN",         THASHCURSOR_SCAN )
    METHOD( "ASARRAY",      THASHCURSOR_ASARRAY )
    METHOD( "CLOSE",        THASHCURSOR_CLOSE )

END_CLASS

/***
 * Metodo: NEW
 * Uso: Constructor de la clase
 * Parametros: Ninguno
 * Devuelve: Self, un objeto inicializado
 */


HB_METHOD( THASHCURSOR_NEW )
{
    PHB_ITEM pSelf = hb_pSelf();
    HASHCURSORP hc = hb_xgrab( sizeof( HASHCURSOR ) );

    if( hc )
    {
        PHB_ITEM paValue = hb_param( 1, HB_IT_ARRAY );

        hc->paValue = hb_itemNew( NULL );

        if( paValue )
        {
            hb_itemCopy( hc->paValue, paValue );
        }
        else
        {
            hb_arrayNew( hc->paValue, 0 );
        }

        if( hb_arrayLen( hc->paValue ) > 0 )
        {
            setRecNo( hc, 1 );
            setEOF( hc, HB_FALSE );
        }
        else
        {
            setRecNo( hc, 0 );
            setEOF( hc, HB_TRUE );
        }

        setBOF( hc, HB_TRUE );
        setFound( hc, HB_FALSE );

        hb_arraySetPtr( pSelf, IVAR_HASHCURSOR, hc );
    }

    /* Devuelve SELF */

    hb_itemReturnRelease( pSelf );
}
 
______________________________________________________________________________
Sevilla - Andalucía
User avatar
Antonio Linares
Site Admin
Posts: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Re: Quien sabe como generar informe del estado de la memoria...

Post by Antonio Linares »

Manuel,

Si revisas en los fuentes de Harbour el módulo fm.c:

https://github.com/harbour/core/blob/master/src/vm/fm.c

Verás que cuando se ha construido con el define HB_FM_STATISTICS se usa una lista enlazada de bloques de memoria que contienen la información que buscas:

En hb_xalloc():

Code: Select all | Expand

if( ! s_pFirstBlock )
      {
         pMem->pPrevBlock = NULL;
         s_pFirstBlock = pMem;
      }
      else
      {
         pMem->pPrevBlock = s_pLastBlock;
         s_pLastBlock->pNextBlock = pMem;
      }
      s_pLastBlock = pMem;
      pMem->pNextBlock = NULL;

      pMem->u32Signature = HB_MEMINFO_SIGNATURE;
      HB_FM_SETSIG( HB_MEM_PTR( pMem ), nSize );
      pMem->nSize = nSize;  /* size of the memory block */

      s_nMemoryConsumed += nSize + sizeof( HB_COUNTER );
      if( s_nMemoryMaxConsumed < s_nMemoryConsumed )
         s_nMemoryMaxConsumed = s_nMemoryConsumed;
      s_nMemoryBlocks++;
      if( s_nMemoryMaxBlocks < s_nMemoryBlocks )
         s_nMemoryMaxBlocks = s_nMemoryBlocks;
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 75 times
Contact:

Re: Quien sabe como generar informe del estado de la memoria...

Post by Antonio Linares »

En s_nMemoryConsumed tendrias la memoria consumida y en s_nMemoryBlocks en número de bloques de memoria

Debe haber alguna función que recorre esos bloques.

Espero que con esta pista tu ya lo puedas solucionar :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
xmanuel
Posts: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Re: Quien sabe como generar informe del estado de la memoria...

Post by xmanuel »

Muchas gracias Antonio...
He recompilado mi Harbour y ya me sale el dichoso informe.

Jejeje qué haríamos sin ti?!!!

PD: Ayer estube en el concierto de tu tocallo Marc Anthony ahí en Málaga, mi mujer es una fanática...

Si hubiera ido con tiempo te aviso para ir a verte.

Muchas gracias por tu ayuda :D
______________________________________________________________________________
Sevilla - Andalucía
Post Reply