Pritpal,

I'm going to try extented FM Stats with something like this .-

HB_TRFM( char *pPtr = (char *)hb_xgrab( size ) );

or .-

HB_TRFM( pObj = ( QTextDecoder* ) new QTextDecoder( hbqt_par_QTextCodec( 1 ) ) 
);

In order to have in hb_out.log for HB_FM_STATISTICS .-

------------------------------------------------------------------------
...
Total memory allocated: 234123 bytes (4176 block(s))
Warning, memory allocated but not released: 1020 bytes (2 block(s))
Block 1 0xd88970 (size 200) MYFUNCTION(256), "200F200F ..."
myfile.c:256 [ char *pPtr = (char *)hb_xgrab( size ) ]
Block 2 0xe4a990 (size 200) QT_QTEXTDECODER(129), "200F200F ..."
qtcore.cpp:129 [ pObj = ( QTextDecoder* ) new QTextDecoder( 
hbqt_par_QTextCodec( 1 ) ) ]
------------------------------------------------------------------------

I think with this FM Stats do it more human-readable, at least for me I find it 
useful.
I hope it can help you.

Best regards,
--
Xavi

El 30/01/2010 3:12, Pritpal Bedi escribió:

Hello All,

What I did
========

Pulled code from hbMK2 and placed along hbIDE files

    ======================================
    #include "hbapi.h"

    #if defined( __cplusplus )

    const char * __hbmk2_hbcppmm( void )
    {
       return "HBCPPMM";
    }

    void * operator new[]( size_t nSize )
    {
       if( nSize == 0 )
          nSize = 1;
HB_TRACE( HB_TR_ALWAYS, ( "              void * operator new[]( size_t %i
)", nSize ) );
       return hb_xgrab( nSize );
    }

    void * operator new( size_t nSize )
    {
       if( nSize == 0 )
          nSize = 1;

       void * pPtr = hb_xgrab( nSize );
HB_TRACE( HB_TR_ALWAYS, ( "              void * operator new( size_t %i )
%p", nSize, pPtr ) );
       return pPtr;
    }

    void operator delete[]( void * ptr )
    {
       if( ptr )
       {
HB_TRACE( HB_TR_ALWAYS, ( "       void operator delete[]( void * %p )", ptr
) );
          hb_xfree( ptr );
HB_TRACE( HB_TR_ALWAYS, ( "              void operator delete[]( void * %p
)", ptr ) );
       }
    }

    void operator delete[]( void * ptr, size_t )
    {
       if( ptr )
       {
HB_TRACE( HB_TR_ALWAYS, ( "       void operator delete[]( void * %p, size_t
)", ptr ) );
          hb_xfree( ptr );
HB_TRACE( HB_TR_ALWAYS, ( "              void operator delete[]( void * %p,
size_t )", ptr ) );
       }
    }

    void operator delete( void * ptr )
    {
       if( ptr )
       {
HB_TRACE( HB_TR_ALWAYS, ( "       void operator delete( void * %p %i)", ptr,
0 ) );
          hb_xfree( ptr );
HB_TRACE( HB_TR_ALWAYS, ( "              void operator delete( void * %p
%i)", ptr, 1 ) );
       }
    }

    void operator delete( void * ptr, size_t nSize )
    {
       if( ptr )
       {
HB_TRACE( HB_TR_ALWAYS, ( "        void operator delete( void * %p, size_t
%i )", ptr, nSize ) );
          hb_xfree( ptr );
HB_TRACE( HB_TR_ALWAYS, ( "              void operator delete( void * %p,
size_t )", ptr ) );
       }
    }

    #endif

    ========================================

Included this file say, cppstub.cpp, in hbIDE.hbp.
Compiled hbIDE =>  hbmk2 hbide.hbp -l- -lpsapi  -nohbcppmm

And under various sections of ideeditor.prg and HBQPlainTextEdit.cpp
I put tracelog. Mainly:


QT_G_FUNC( hbqt_gcRelease_HBQPlainTextEdit )
{
    QGC_POINTER_HBQPlainTextEdit * p = ( QGC_POINTER_HBQPlainTextEdit * )
Cargo;

    if( p&&  p->bNew )
    {
       if( p->ph&&  p->pq )
       {
          const QMetaObject * m = ( ( QObject * ) p->ph )->metaObject();
          if( ( QString ) m->className() != ( QString ) "QObject" )
          {
HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit
----------------------------------------" ) );
             delete ( ( HBQPlainTextEdit * ) p->ph );
             HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit
ph=%p pq=%p %i B %i KB", p->ph, (void *)(p->pq), ( int ) hb_xquery( 1001 ),
hbqt_getmemused() ) );
             if ( p->ph )
             {
HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit           ph=%p
-------------0", p->ph ) );
                delete( p->ph );
HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit           ph=%p
-------------1", p->ph ) );
             }
             //p->ph = NULL;
          }
          else
          {
             HB_TRACE( HB_TR_ALWAYS, ( "NO__rel_HBQPlainTextEdit
ph=%p pq=%p %i B %i KB", p->ph, (void *)(p->pq), ( int ) hb_xquery( 1001 ),
hbqt_getmemused() ) );
          }
       }
       else
       {
          HB_TRACE( HB_TR_ALWAYS, ( "DEL_rel_HBQPlainTextEdit
Object already deleted!" ) );
       }
    }
    else
    {
       HB_TRACE( HB_TR_ALWAYS, ( "PTR_rel_HBQPlainTextEdit            Object
not created with - new" ) );
       p->ph = NULL;
    }
}

void * hbqt_gcAllocate_HBQPlainTextEdit( void * pObj, bool bNew )
{
    QGC_POINTER_HBQPlainTextEdit * p = ( QGC_POINTER_HBQPlainTextEdit * )
hb_gcAllocate( sizeof( QGC_POINTER_HBQPlainTextEdit ), hbqt_gcFuncs() );

    p->ph = pObj;
    p->bNew = bNew;
    p->func = hbqt_gcRelease_HBQPlainTextEdit;

    if( bNew )
    {
       new(&  p->pq ) QPointer<  HBQPlainTextEdit>( ( HBQPlainTextEdit * )
pObj );
       HB_TRACE( HB_TR_ALWAYS, ( "   _new_HBQPlainTextEdit           ph=%p %i
B %i KB", pObj, ( int ) hb_xquery( 1001 ), hbqt_getmemused() ) );
    }
    return p;
}

HB_FUNC( QT_HBQPLAINTEXTEDIT )
{
HB_TRACE( HB_TR_ALWAYS, ( "   HB_FUNC( QT_HBQPLAINTEXTEDIT )        0" ) );
    void * pObj = NULL;

    if( hb_pcount() == 1&&  HB_ISCHAR( 1 ) )
    {
       pObj = new HBQPlainTextEdit() ;
    }
    else if( hb_pcount() == 1&&  HB_ISPOINTER( 1 ) )
    {
       pObj = new HBQPlainTextEdit( hbqt_par_QWidget( 1 ) ) ;
    }
    else
    {
       pObj = new HBQPlainTextEdit() ;
    }

    hb_retptrGC( hbqt_gcAllocate_HBQPlainTextEdit( pObj, true ) );
}


And got the result as:

HBQPlainTextEdit.cpp:146: HB_TR_ALWAYS    HB_FUNC( QT_HBQPLAINTEXTEDIT )
0
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 100 )
0x38ace78
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 24 )
0x38acf40
HBQPlainTextEdit.cpp:139: HB_TR_ALWAYS    _new_HBQPlainTextEdit
ph=0x38ace78 2511315 B 48176 KB
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 16 )
0x38b3ba8
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 84 )
0x38c4598

                  // -----------------------------------------------
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 8 )
0x38b0fa0
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 16 )
0x38af1b8
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 4 )
0x38a7db8
cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38af1b8
0)
cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38af1b8 1)
cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38a7db8
0)
cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38a7db8 1)
cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38b0fa0
0)
cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38b0fa0 1)
                  --------------------------------------------------//
DELETED : many entries exactly same to above block with exactly same pointer
reference

cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 4 )
0x38b0fa0

cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 32 )
0x38c6188
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 32 )
0x38c6c00
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 16 )
0x38c6280
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 20 )
0x38ca448
cppstub.cpp:26: HB_TR_ALWAYS               void * operator new( size_t 16 )
0x38c8998

  idemisc.prg:843:HBIDE_DBG() HB_TR_ALWAYS IdeEdit:destroy()          4

  HBQPlainTextEdit.cpp:100: HB_TR_ALWAYS YES_rel_HBQPlainTextEdit
----------------------------------------
  hbqt_hbqplaintextedit.cpp:100: HB_TR_ALWAYS
HBQPlainTextEdit::~HBQPlainTextEdit()          0
  hbqt_hbqplaintextedit.cpp:102: HB_TR_ALWAYS
HBQPlainTextEdit::~HBQPlainTextEdit()          1
  hbqt_hbqplaintextedit.cpp:104: HB_TR_ALWAYS
HBQPlainTextEdit::~HBQPlainTextEdit()          2
  hbqt_hbqplaintextedit.cpp:106: HB_TR_ALWAYS
HBQPlainTextEdit::~HBQPlainTextEdit()          3
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38acf40
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38acf40 1)
  hbqt_hbqplaintextedit.cpp:108: HB_TR_ALWAYS
HBQPlainTextEdit::~HBQPlainTextEdit()          4
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38c4598
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38c4598 1)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38ace78
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x38ace78 1)
  HBQPlainTextEdit.cpp:102: HB_TR_ALWAYS YES_rel_HBQPlainTextEdit
ph=0x38ace78 pq=(nil) 2695135 B 51508 KB
  HBQPlainTextEdit.cpp:105: HB_TR_ALWAYS YES_rel_HBQPlainTextEdit
ph=0x38ace78 -------------0
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38ace78
0)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124e988
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124e988 1)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124e918
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124e918 1)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124e8a8
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124e8a8 1)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124e838
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124e838 1)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x1210b18
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x1210b18 1)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x11f4eb8
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x11f4eb8 1)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x11e6e28
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x11e6e28 1)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x11ee290
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x11ee290 1)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124a7c0
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124a7c0 1)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x1248230
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x1248230 1)

                                      GPF

==============================================

The above clubs a life cycle of a Qt objects's creation to destruction.

Note this section:


             if ( p->ph )
             {
HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit           ph=%p
-------------0", p->ph ) );
                delete( p->ph );
HB_TRACE( HB_TR_ALWAYS, ( "YES_rel_HBQPlainTextEdit           ph=%p
-------------1", p->ph ) );
             }
             //p->ph = NULL;


If I follow already used method =>  p->ph = NULL;
then last section :

  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38ace78
0)
  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x124e988
0)
  cppstub.cpp:56: HB_TR_ALWAYS               void operator delete( void *
0x124e988 1)
  ...
  ...

is never reached, fm logs points to unreleased memory block ( 1 only ).

But when is call =>  delete( p->ph ) then the above pointers are freed
but at the point when I expect end of this pointer:

  cppstub.cpp:54: HB_TR_ALWAYS        void operator delete( void * 0x38ace78
0)

which is p->ph itself I get GPF. It is valid because
     delete ( ( HBQPlainTextEdit * ) p->ph );
has already been issued.

The point to consider deep is : the pointers being freed after 2nd delete
are
actually obtained when new HBQPlaintTextedit() was called. But how come a
pointer is triggering the other pointers to be freed when it itself has
already been
freed.

I am unable to consolidate myself an above phenomena. But for sure this is
EXACTLY what is consuming memory as pointers contained within pointers were
never being released.

Hope you can pin-point the issue.




-----
                  enjoy hbIDEing...
                     Pritpal Bedi
_a_student_of_software_analysis_&_design_
_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to