perfsrv/memspy/Engine/Source/Helpers/MemSpyEngineHelperHeap.cpp
author hgs
Wed, 29 Sep 2010 17:45:35 +0300
changeset 54 a151135b0cf9
parent 52 c2f44e33b468
child 62 1c2bb2fc7c87
permissions -rw-r--r--
201039
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <memspy/engine/memspyenginehelperheap.h>
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// System includes
hgs
parents:
diff changeset
    21
#include <s32mem.h>
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
// Driver includes
hgs
parents:
diff changeset
    24
#include <memspy/driver/memspydriverclient.h>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
// User includes
hgs
parents:
diff changeset
    27
#include <memspy/engine/memspyengine.h>
hgs
parents:
diff changeset
    28
#include <memspy/engine/memspyengineutils.h>
hgs
parents:
diff changeset
    29
#include <memspy/engine/memspyengineoutputsink.h>
hgs
parents:
diff changeset
    30
#include <memspy/engine/memspyengineoutputlist.h>
hgs
parents:
diff changeset
    31
#include <memspy/engine/memspyengineobjectthread.h>
hgs
parents:
diff changeset
    32
#include <memspy/engine/memspyengineobjectprocess.h>
hgs
parents:
diff changeset
    33
#include <memspy/engine/memspyenginehelperrom.h>
hgs
parents:
diff changeset
    34
#include <memspy/engine/memspyengineobjectcontainer.h>
hgs
parents:
diff changeset
    35
#include <memspy/engine/memspyenginehelpercodesegment.h>
hgs
parents:
diff changeset
    36
#include <memspy/driver/memspydriverenumerationsshared.h>
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
// Constants
hgs
parents:
diff changeset
    39
const TBool KMemSpyHeapDumpCreateOwnDataStream = ETrue;
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
// Literal constants
hgs
parents:
diff changeset
    42
_LIT( KCellTypeGoodAllocatedCell,        "[Allocated Cell]            ");
hgs
parents:
diff changeset
    43
_LIT( KCellTypeGoodFreeCell,             "[Free Cell]                 ");
hgs
parents:
diff changeset
    44
_LIT( KCellTypeBadAllocatedCellSize,     "[Bad Allocated Cell Size]   ");
hgs
parents:
diff changeset
    45
_LIT( KCellTypeBadAllocatedCellAddress,  "[Bad Allocated Cell Address]");
hgs
parents:
diff changeset
    46
_LIT( KCellTypeBadFreeCellAddress,       "[Bad Free Cell Address]     ");
hgs
parents:
diff changeset
    47
_LIT( KCellTypeBadFreeCellSize,          "[Bad Free Cell Size]        ");
hgs
parents:
diff changeset
    48
_LIT( KCellTypeBad,                      "[Bad Cell]                  ");
hgs
parents:
diff changeset
    49
_LIT( KCellTypeUnknown,                  "[Unknown!]                  ");
hgs
parents:
diff changeset
    50
_LIT( KCellListLineFormat, "%S cell: 0x%08x, cellLen: %8d, allocNum: %8d, nestingLev: %8d, cellData: 0x%08x, cellDataAddr: 0x%08x, headerSize: %02d");
hgs
parents:
diff changeset
    51
_LIT( KMemSpyMarkerHeapData, "<%SMEMSPY_HEAP_DATA_%03d>" );
hgs
parents:
diff changeset
    52
_LIT( KMemSpyMarkerCSV, "<%SMEMSPY_HEAP_CSV>" );
hgs
parents:
diff changeset
    53
_LIT( KMemSpyPrefixHeapData, "HeapData - %S - ");
hgs
parents:
diff changeset
    54
_LIT( KMemSpyPrefixCellList, "CellList - %S - ");
hgs
parents:
diff changeset
    55
_LIT( KMemSpyPrefixCSV, "CSV - " );
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
CMemSpyEngineHelperHeap::CMemSpyEngineHelperHeap( CMemSpyEngine& aEngine )
hgs
parents:
diff changeset
    59
:   iEngine( aEngine )
hgs
parents:
diff changeset
    60
    {
hgs
parents:
diff changeset
    61
    }
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
    
hgs
parents:
diff changeset
    64
CMemSpyEngineHelperHeap::~CMemSpyEngineHelperHeap()
hgs
parents:
diff changeset
    65
    {
hgs
parents:
diff changeset
    66
    }
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
void CMemSpyEngineHelperHeap::ConstructL()
hgs
parents:
diff changeset
    70
    {
hgs
parents:
diff changeset
    71
    }
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
CMemSpyEngineHelperHeap* CMemSpyEngineHelperHeap::NewL( CMemSpyEngine& aEngine )
hgs
parents:
diff changeset
    75
    {
hgs
parents:
diff changeset
    76
    CMemSpyEngineHelperHeap* self = new(ELeave) CMemSpyEngineHelperHeap( aEngine );
hgs
parents:
diff changeset
    77
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    78
    self->ConstructL();
hgs
parents:
diff changeset
    79
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    80
    return self;
hgs
parents:
diff changeset
    81
    }
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
EXPORT_C void CMemSpyEngineHelperHeap::OutputCellListingUserL( const CMemSpyThread& aThread )
hgs
parents:
diff changeset
    93
    {
hgs
parents:
diff changeset
    94
    // Suspend the process
hgs
parents:
diff changeset
    95
    iEngine.ProcessSuspendLC( aThread.Process().Id() );
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
    // Free cells
hgs
parents:
diff changeset
    98
    RArray<TMemSpyDriverFreeCell> freeCells;
hgs
parents:
diff changeset
    99
    CleanupClosePushL( freeCells );
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
    // Info section
hgs
parents:
diff changeset
   102
    TMemSpyHeapInfo heapInfo;
hgs
parents:
diff changeset
   103
    const TInt error = iEngine.Driver().GetHeapInfoUser( heapInfo, aThread.Id(), freeCells );
hgs
parents:
diff changeset
   104
    if ( error == KErrNone )
hgs
parents:
diff changeset
   105
        {
hgs
parents:
diff changeset
   106
        UpdateSharedHeapInfoL( aThread.Process().Id(), aThread.Id(), heapInfo );
hgs
parents:
diff changeset
   107
        }
hgs
parents:
diff changeset
   108
    if  ( error == KErrNone && heapInfo.Type() != TMemSpyHeapInfo::ETypeUnknown )
hgs
parents:
diff changeset
   109
        {
hgs
parents:
diff changeset
   110
        // Get thread name for context
hgs
parents:
diff changeset
   111
        const TFullName pName( aThread.FullName() );
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
        // Begin a new data stream
hgs
parents:
diff changeset
   114
        _LIT( KMemSpyFolder, "Heap\\Cell List" );
hgs
parents:
diff changeset
   115
        _LIT( KMemSpyContext, "Cell List - %S" );
hgs
parents:
diff changeset
   116
        HBufC* context = HBufC::NewLC( KMaxFileName );
hgs
parents:
diff changeset
   117
        TPtr pContext( context->Des() );
hgs
parents:
diff changeset
   118
        pContext.Format( KMemSpyContext, &pName );
hgs
parents:
diff changeset
   119
        iEngine.Sink().DataStreamBeginL( pContext, KMemSpyFolder );
hgs
parents:
diff changeset
   120
        CleanupStack::PopAndDestroy( context );
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
        // Set prefix for overall listing
hgs
parents:
diff changeset
   123
        iEngine.Sink().OutputPrefixSetFormattedLC( KMemSpyPrefixCellList, &pName );
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
        // Start new section
hgs
parents:
diff changeset
   126
        _LIT(KHeader, "CELL LISTING");
hgs
parents:
diff changeset
   127
        iEngine.Sink().OutputSectionHeadingL( KHeader, '=' );
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
        // Prepare temp buffers
hgs
parents:
diff changeset
   130
        TBuf<KMaxFullName + 100> printFormat;
hgs
parents:
diff changeset
   131
        HBufC* tempBuffer = HBufC::NewLC( 2048 );
hgs
parents:
diff changeset
   132
        TPtr pTempBuffer( tempBuffer->Des() );
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
        // Print initial info
hgs
parents:
diff changeset
   135
        OutputHeapInfoL( heapInfo, pName, &freeCells );
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
        // Code segments (needed for map file reading...)
hgs
parents:
diff changeset
   138
        _LIT(KCellListCodeSegInfoFormat, "CodeSegs - ");
hgs
parents:
diff changeset
   139
        iEngine.HelperCodeSegment().OutputCodeSegmentsL( aThread.Process().Id(), printFormat, KCellListCodeSegInfoFormat, '-', ETrue );
hgs
parents:
diff changeset
   140
    
hgs
parents:
diff changeset
   141
        // Now walk the heap!
hgs
parents:
diff changeset
   142
        TInt r = iEngine.Driver().WalkHeapInit( aThread.Id() );
hgs
parents:
diff changeset
   143
        if  ( r == KErrNone )
hgs
parents:
diff changeset
   144
            {
hgs
parents:
diff changeset
   145
             _LIT(KHeader2, "Cells");
hgs
parents:
diff changeset
   146
            iEngine.Sink().OutputSectionHeadingL( KHeader2, '-' );
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
            TMemSpyDriverCellType cellType;
hgs
parents:
diff changeset
   149
            TAny* cellAddress;
hgs
parents:
diff changeset
   150
            TInt cellLength;
hgs
parents:
diff changeset
   151
            TInt cellNestingLevel;
hgs
parents:
diff changeset
   152
            TInt cellAllocationNumber;
hgs
parents:
diff changeset
   153
            TInt cellHeaderSize;
hgs
parents:
diff changeset
   154
            TAny* cellPayloadAddress;
hgs
parents:
diff changeset
   155
            TBuf8<4> cellData;
hgs
parents:
diff changeset
   156
            //
hgs
parents:
diff changeset
   157
            r = iEngine.Driver().WalkHeapNextCell( aThread.Id(), cellType, cellAddress, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
hgs
parents:
diff changeset
   158
            while( r == KErrNone )
hgs
parents:
diff changeset
   159
                {
hgs
parents:
diff changeset
   160
                TUint fourByteCellData = 0;
hgs
parents:
diff changeset
   161
                TPtrC pType(KNullDesC);
hgs
parents:
diff changeset
   162
                //
hgs
parents:
diff changeset
   163
				if (cellType & EMemSpyDriverAllocatedCellMask)
hgs
parents:
diff changeset
   164
					{
hgs
parents:
diff changeset
   165
                    r = iEngine.Driver().WalkHeapReadCellData( cellAddress, cellData, 4 );
hgs
parents:
diff changeset
   166
                    if  ( r == KErrNone )
hgs
parents:
diff changeset
   167
                        {
hgs
parents:
diff changeset
   168
                        fourByteCellData = DescriptorAsDWORD( cellData );
hgs
parents:
diff changeset
   169
                        }
hgs
parents:
diff changeset
   170
                    pType.Set(KCellTypeGoodAllocatedCell);
hgs
parents:
diff changeset
   171
                    }
hgs
parents:
diff changeset
   172
				else if (cellType & EMemSpyDriverFreeCellMask)
hgs
parents:
diff changeset
   173
					{
hgs
parents:
diff changeset
   174
                    pType.Set(KCellTypeGoodFreeCell);
hgs
parents:
diff changeset
   175
					}
hgs
parents:
diff changeset
   176
				else if (cellType & EMemSpyDriverBadCellMask)
hgs
parents:
diff changeset
   177
					{
hgs
parents:
diff changeset
   178
					switch (cellType)
hgs
parents:
diff changeset
   179
						{
hgs
parents:
diff changeset
   180
					case EMemSpyDriverHeapBadAllocatedCellSize:
hgs
parents:
diff changeset
   181
						pType.Set(KCellTypeBadAllocatedCellSize);
hgs
parents:
diff changeset
   182
						break;
hgs
parents:
diff changeset
   183
					case EMemSpyDriverHeapBadAllocatedCellAddress:
hgs
parents:
diff changeset
   184
						pType.Set(KCellTypeBadAllocatedCellAddress);
hgs
parents:
diff changeset
   185
						break;
hgs
parents:
diff changeset
   186
					case EMemSpyDriverHeapBadFreeCellAddress:
hgs
parents:
diff changeset
   187
						pType.Set(KCellTypeBadFreeCellAddress);
hgs
parents:
diff changeset
   188
						break;
hgs
parents:
diff changeset
   189
					case EMemSpyDriverHeapBadFreeCellSize:
hgs
parents:
diff changeset
   190
						pType.Set(KCellTypeBadFreeCellSize);
hgs
parents:
diff changeset
   191
						break;
hgs
parents:
diff changeset
   192
					default:
hgs
parents:
diff changeset
   193
						pType.Set(KCellTypeBad);
hgs
parents:
diff changeset
   194
						break;
hgs
parents:
diff changeset
   195
						}
hgs
parents:
diff changeset
   196
					}
hgs
parents:
diff changeset
   197
				else
hgs
parents:
diff changeset
   198
					{
hgs
parents:
diff changeset
   199
                    pType.Set(KCellTypeUnknown);
hgs
parents:
diff changeset
   200
                    }
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
                if  ( r == KErrNone )
hgs
parents:
diff changeset
   203
                    {
hgs
parents:
diff changeset
   204
                    pTempBuffer.Format( KCellListLineFormat, &pType, cellAddress, cellLength, cellAllocationNumber, cellNestingLevel, fourByteCellData, cellPayloadAddress, cellHeaderSize );
hgs
parents:
diff changeset
   205
                    iEngine.Sink().OutputLineL( pTempBuffer );
hgs
parents:
diff changeset
   206
                    //
hgs
parents:
diff changeset
   207
                    r = iEngine.Driver().WalkHeapNextCell( aThread.Id(), cellType, cellAddress, cellLength, cellNestingLevel, cellAllocationNumber, cellHeaderSize, cellPayloadAddress );
hgs
parents:
diff changeset
   208
                    }
hgs
parents:
diff changeset
   209
                }
hgs
parents:
diff changeset
   210
            //
hgs
parents:
diff changeset
   211
            iEngine.Driver().WalkHeapClose();
hgs
parents:
diff changeset
   212
            }
hgs
parents:
diff changeset
   213
        CleanupStack::PopAndDestroy( tempBuffer );
hgs
parents:
diff changeset
   214
        CleanupStack::PopAndDestroy(); // clear prefix
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
        iEngine.Sink().DataStreamEndL();
hgs
parents:
diff changeset
   217
        }
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
    CleanupStack::PopAndDestroy( &freeCells );
hgs
parents:
diff changeset
   220
    CleanupStack::PopAndDestroy(); // resume process
hgs
parents:
diff changeset
   221
    }
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapDataUserL( const CMemSpyThread& aThread )
hgs
parents:
diff changeset
   242
    {
hgs
parents:
diff changeset
   243
    OutputHeapDataUserL( aThread, KMemSpyHeapDumpCreateOwnDataStream );
hgs
parents:
diff changeset
   244
    }
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
void CMemSpyEngineHelperHeap::OutputHeapDataUserL( const CMemSpyThread& aThread, TBool aCreateDataStream )
hgs
parents:
diff changeset
   248
    {
hgs
parents:
diff changeset
   249
    // Make sure the process is suspended for the entire time we are manipulating it's heap
hgs
parents:
diff changeset
   250
    iEngine.ProcessSuspendLC( aThread.Process().Id() );
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
    // Get the heap info, including cell information
hgs
parents:
diff changeset
   253
    RArray<TMemSpyDriverCell> cells;
hgs
parents:
diff changeset
   254
    CleanupClosePushL( cells );
hgs
parents:
diff changeset
   255
    TMemSpyHeapInfo heapInfo;
hgs
parents:
diff changeset
   256
    TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::OutputHeapDataUserL() - checksum1: 0x%08x", heapInfo.AsRHeap().Statistics().StatsFree().Checksum() ) );
hgs
parents:
diff changeset
   257
    GetHeapInfoUserL(aThread.Process().Id(), aThread.Id(), heapInfo, &cells, ETrue);
hgs
parents:
diff changeset
   258
    TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::OutputHeapDataUserL() - checksum2: 0x%08x", heapInfo.AsRHeap().Statistics().StatsFree().Checksum() ) );
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
    // Get the heap data
hgs
parents:
diff changeset
   261
    const TFullName pName( aThread.FullName() );
hgs
parents:
diff changeset
   262
    OutputHeapDataUserL( aThread.Process().Id(), aThread.Id(), pName, heapInfo, aCreateDataStream, &cells );
hgs
parents:
diff changeset
   263
    CleanupStack::PopAndDestroy( &cells );
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
    // Resume process
hgs
parents:
diff changeset
   266
    CleanupStack::PopAndDestroy();
hgs
parents:
diff changeset
   267
    }
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
52
hgs
parents: 51
diff changeset
   270
EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapDataUserL(const TProcessId& aPid, 
hgs
parents: 51
diff changeset
   271
                                                           const TThreadId& aTid, 
hgs
parents: 51
diff changeset
   272
                                                           const TDesC& aThreadName, 
hgs
parents: 51
diff changeset
   273
                                                           const TMemSpyHeapInfo& aInfo, 
hgs
parents: 51
diff changeset
   274
                                                           const RArray<TMemSpyDriverCell>* aCells)
51
hgs
parents:
diff changeset
   275
    {
hgs
parents:
diff changeset
   276
    OutputHeapDataUserL(aPid, aTid, aThreadName, aInfo, ETrue, aCells);
hgs
parents:
diff changeset
   277
    }
hgs
parents:
diff changeset
   278
52
hgs
parents: 51
diff changeset
   279
void CMemSpyEngineHelperHeap::OutputHeapDataUserL(const TProcessId& aPid, 
hgs
parents: 51
diff changeset
   280
                                                  const TThreadId& aTid, 
hgs
parents: 51
diff changeset
   281
                                                  const TDesC& aThreadName, 
hgs
parents: 51
diff changeset
   282
                                                  const TMemSpyHeapInfo& aInfo, 
hgs
parents: 51
diff changeset
   283
                                                  TBool aCreateDataStream, 
hgs
parents: 51
diff changeset
   284
                                                  const RArray<TMemSpyDriverCell>* aCells )
51
hgs
parents:
diff changeset
   285
    {
hgs
parents:
diff changeset
   286
    TBuf<KMaxFullName + 100> printFormat;
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
    // Begin a new data stream
hgs
parents:
diff changeset
   289
    if  ( aCreateDataStream )
hgs
parents:
diff changeset
   290
        {
hgs
parents:
diff changeset
   291
        _LIT( KMemSpyFolder, "Heap\\Data" );
hgs
parents:
diff changeset
   292
        _LIT( KMemSpyContext, "Heap Data - %S" );
hgs
parents:
diff changeset
   293
        HBufC* context = HBufC::NewLC( KMaxFileName );
hgs
parents:
diff changeset
   294
        TPtr pContext( context->Des() );
hgs
parents:
diff changeset
   295
        pContext.Format( KMemSpyContext, &aThreadName );
hgs
parents:
diff changeset
   296
        iEngine.Sink().DataStreamBeginL( pContext, KMemSpyFolder );
hgs
parents:
diff changeset
   297
        CleanupStack::PopAndDestroy( context );
hgs
parents:
diff changeset
   298
        }
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
    // Get the heap info first of all
hgs
parents:
diff changeset
   301
    iEngine.ProcessSuspendLC( aPid );
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
    // Start marker
hgs
parents:
diff changeset
   304
    iEngine.Sink().OutputLineFormattedL( KMemSpyMarkerHeapData, &KNullDesC, (TUint) aTid );
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
    // Set overall prefix
hgs
parents:
diff changeset
   307
    iEngine.Sink().OutputPrefixSetFormattedLC( KMemSpyPrefixHeapData, &aThreadName );
hgs
parents:
diff changeset
   308
hgs
parents:
diff changeset
   309
    // Info section
hgs
parents:
diff changeset
   310
    OutputHeapInfoL( aInfo, aThreadName, aCells );
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
    // Code segments (needed for map file reading...)
hgs
parents:
diff changeset
   313
    _LIT(KCellListCodeSegInfoFormat, "CodeSegs - ");
hgs
parents:
diff changeset
   314
    iEngine.HelperCodeSegment().OutputCodeSegmentsL( aPid, printFormat, KCellListCodeSegInfoFormat, '-', ETrue );
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
    // Dump section
hgs
parents:
diff changeset
   317
    _LIT(KHeaderDump, "Heap Data");
hgs
parents:
diff changeset
   318
    iEngine.Sink().OutputSectionHeadingL( KHeaderDump, '-' );
hgs
parents:
diff changeset
   319
hgs
parents:
diff changeset
   320
    HBufC8* data = HBufC8::NewLC( 4096 * 12 );
hgs
parents:
diff changeset
   321
    TPtr8 pData(data->Des());
hgs
parents:
diff changeset
   322
    TUint remaining = 0;
hgs
parents:
diff changeset
   323
    TUint readAddress = 0;
hgs
parents:
diff changeset
   324
hgs
parents:
diff changeset
   325
    // When we obtained the heap info, we also obtained a checksum of all the free cells
hgs
parents:
diff changeset
   326
    // within the specified heap. We validate that this hasn't changed at the time we
hgs
parents:
diff changeset
   327
    // request the heap data for paranoia purposes (There have been "Issues" with MemSpy
hgs
parents:
diff changeset
   328
    // not actually suspending a process between fetching heap info & heap data, causing
hgs
parents:
diff changeset
   329
    // a mismatch in free cell information).
hgs
parents:
diff changeset
   330
    const TUint32 checksum = aInfo.AsRHeap().Statistics().StatsFree().Checksum();
hgs
parents:
diff changeset
   331
    TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::OutputHeapDataUserL() - checksum: 0x%08x", checksum ) );
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
    TInt r = iEngine.Driver().GetHeapData( aTid, checksum, pData, readAddress, remaining );
hgs
parents:
diff changeset
   334
	TUint prevEndAddress = readAddress + pData.Length();
hgs
parents:
diff changeset
   335
    if (r == KErrNone)
hgs
parents:
diff changeset
   336
        {
hgs
parents:
diff changeset
   337
        while (r == KErrNone)
hgs
parents:
diff changeset
   338
            {
hgs
parents:
diff changeset
   339
			if (readAddress > prevEndAddress)
hgs
parents:
diff changeset
   340
				{
hgs
parents:
diff changeset
   341
				// We've hit a discontinuity, ie one or more unmapped pages
hgs
parents:
diff changeset
   342
				_LIT(KBreak, "........");
hgs
parents:
diff changeset
   343
				iEngine.Sink().OutputLineL(KBreak);
hgs
parents:
diff changeset
   344
				}
hgs
parents:
diff changeset
   345
            _LIT(KHeapDumpDataFormat, "%S");
hgs
parents:
diff changeset
   346
            iEngine.Sink().OutputBinaryDataL(KHeapDumpDataFormat, pData.Ptr(), (const TUint8*) readAddress, pData.Length());
hgs
parents:
diff changeset
   347
			readAddress += pData.Length();
hgs
parents:
diff changeset
   348
            if (remaining > 0)
hgs
parents:
diff changeset
   349
				{
hgs
parents:
diff changeset
   350
				prevEndAddress = readAddress;
hgs
parents:
diff changeset
   351
                r = iEngine.Driver().GetHeapDataNext(aTid, pData, readAddress, remaining);
hgs
parents:
diff changeset
   352
				}
hgs
parents:
diff changeset
   353
            else
hgs
parents:
diff changeset
   354
                break;
hgs
parents:
diff changeset
   355
            }
hgs
parents:
diff changeset
   356
        }
hgs
parents:
diff changeset
   357
    else
hgs
parents:
diff changeset
   358
        {
hgs
parents:
diff changeset
   359
        _LIT( KHeapFetchError, "Heap error: %d");
hgs
parents:
diff changeset
   360
        iEngine.Sink().OutputLineFormattedL( KHeapFetchError, r );
hgs
parents:
diff changeset
   361
        }
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
    CleanupStack::PopAndDestroy( data );
hgs
parents:
diff changeset
   364
hgs
parents:
diff changeset
   365
    CleanupStack::PopAndDestroy(); // clear prefix
hgs
parents:
diff changeset
   366
    CleanupStack::PopAndDestroy(); // resume process
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
    // End marker
hgs
parents:
diff changeset
   369
    iEngine.Sink().OutputLineFormattedL( KMemSpyMarkerHeapData, &KMemSpySinkTagClose, (TUint) aTid );
hgs
parents:
diff changeset
   370
hgs
parents:
diff changeset
   371
    if  ( aCreateDataStream )
hgs
parents:
diff changeset
   372
        {
hgs
parents:
diff changeset
   373
        iEngine.Sink().DataStreamEndL();
hgs
parents:
diff changeset
   374
        }
hgs
parents:
diff changeset
   375
    }
hgs
parents:
diff changeset
   376
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
hgs
parents:
diff changeset
   380
hgs
parents:
diff changeset
   381
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
hgs
parents:
diff changeset
   386
hgs
parents:
diff changeset
   387
hgs
parents:
diff changeset
   388
hgs
parents:
diff changeset
   389
hgs
parents:
diff changeset
   390
hgs
parents:
diff changeset
   391
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
hgs
parents:
diff changeset
   394
52
hgs
parents: 51
diff changeset
   395
EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapInfoL(const TMemSpyHeapInfo& aInfo, 
hgs
parents: 51
diff changeset
   396
                                                       const TDesC& aThreadName, 
hgs
parents: 51
diff changeset
   397
                                                       const RArray<TMemSpyDriverCell>* aCells )
51
hgs
parents:
diff changeset
   398
	{
hgs
parents:
diff changeset
   399
    CMemSpyEngineOutputList* list = NewHeapSummaryExtendedLC(aInfo, aCells);
hgs
parents:
diff changeset
   400
hgs
parents:
diff changeset
   401
    // Format the thread name according to upper/lower case request parameters
hgs
parents:
diff changeset
   402
    _LIT( KOverallCaption1, "HEAP INFO FOR THREAD '%S'");
hgs
parents:
diff changeset
   403
    list->InsertItemFormatUCL( 0, KOverallCaption1, &aThreadName );
hgs
parents:
diff changeset
   404
    list->InsertUnderlineForItemAtL( 0 );
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
    // Print it
hgs
parents:
diff changeset
   407
    list->PrintL();
hgs
parents:
diff changeset
   408
hgs
parents:
diff changeset
   409
    // Tidy up
hgs
parents:
diff changeset
   410
    CleanupStack::PopAndDestroy( list );
hgs
parents:
diff changeset
   411
    }
hgs
parents:
diff changeset
   412
hgs
parents:
diff changeset
   413
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
hgs
parents:
diff changeset
   422
hgs
parents:
diff changeset
   423
hgs
parents:
diff changeset
   424
hgs
parents:
diff changeset
   425
hgs
parents:
diff changeset
   426
hgs
parents:
diff changeset
   427
hgs
parents:
diff changeset
   428
hgs
parents:
diff changeset
   429
hgs
parents:
diff changeset
   430
hgs
parents:
diff changeset
   431
hgs
parents:
diff changeset
   432
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
hgs
parents:
diff changeset
   435
hgs
parents:
diff changeset
   436
hgs
parents:
diff changeset
   437
hgs
parents:
diff changeset
   438
hgs
parents:
diff changeset
   439
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
52
hgs
parents: 51
diff changeset
   442
void CMemSpyEngineHelperHeap::OutputCSVEntryL(TInt aIndex, 
hgs
parents: 51
diff changeset
   443
                                              const TMemSpyHeapInfo& aInfo, 
hgs
parents: 51
diff changeset
   444
                                              const TDesC& aThreadName, 
hgs
parents: 51
diff changeset
   445
                                              const TDesC& aProcessName )
51
hgs
parents:
diff changeset
   446
    {
hgs
parents:
diff changeset
   447
    const TMemSpyHeapInfoRHeap& rHeapInfo = aInfo.AsRHeap();
hgs
parents:
diff changeset
   448
    const TMemSpyHeapMetaDataRHeap& rHeapMetaData = rHeapInfo.MetaData();
hgs
parents:
diff changeset
   449
    const TMemSpyHeapStatisticsRHeap& rHeapStats = rHeapInfo.Statistics();
hgs
parents:
diff changeset
   450
hgs
parents:
diff changeset
   451
    // Example:
hgs
parents:
diff changeset
   452
    //
hgs
parents:
diff changeset
   453
    //  <ENTRY_001>
hgs
parents:
diff changeset
   454
    //      <THREAD_NAME_001>ESock_IP</THREAD_NAME_001>
hgs
parents:
diff changeset
   455
    //      <PROCESS_NAME_001>c32exe.exe[101f7989]0001</PROCESS_NAME_001>
hgs
parents:
diff changeset
   456
    //      <CHUNK_NAME_001>Local-c812ba58</CHUNK_NAME_001>
hgs
parents:
diff changeset
   457
    //      <FIELDS_001>1,0x12400000,0x00c00074,36744,4092,524288,0x00c011a4,0,13,6872,1368,1680,2584,219,40,28996,0</FIELDS_001>
hgs
parents:
diff changeset
   458
    //  </ENTRY_001>
hgs
parents:
diff changeset
   459
    
hgs
parents:
diff changeset
   460
    _LIT( KFmtTagOpenAndClose, "<%S_%04d>%S</%S_%04d>" );
hgs
parents:
diff changeset
   461
    
hgs
parents:
diff changeset
   462
    _LIT( KFmtEntryId, "<%SENTRY_%04d>");
hgs
parents:
diff changeset
   463
    _LIT( KFmtNameThread, "THREAD_NAME");
hgs
parents:
diff changeset
   464
    _LIT( KFmtNameProcess, "PROCESS_NAME");
hgs
parents:
diff changeset
   465
    _LIT( KFmtNameChunk, "CHUNK_NAME");
hgs
parents:
diff changeset
   466
    _LIT( KFmtFields, "FIELDS");
hgs
parents:
diff changeset
   467
    _LIT( KFmtFieldContent , "<%S_%04d>%06d,0x%08x,0x%08x,%d,%d,%d,0x%08x,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d</%S_%04d>");
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
    // <ENTRY_001>
hgs
parents:
diff changeset
   470
    iEngine.Sink().OutputLineFormattedL( KFmtEntryId, &KNullDesC, aIndex );
hgs
parents:
diff changeset
   471
    
hgs
parents:
diff changeset
   472
    //      <THREAD_NAME_001>ESock_IP</THREAD_NAME_001>
hgs
parents:
diff changeset
   473
    iEngine.Sink().OutputLineFormattedL( KFmtTagOpenAndClose, &KFmtNameThread, aIndex, &aThreadName, &KFmtNameThread, aIndex );
hgs
parents:
diff changeset
   474
    
hgs
parents:
diff changeset
   475
    //      <PROCESS_NAME_001>c32exe.exe[101f7989]0001</PROCESS_NAME_001>
hgs
parents:
diff changeset
   476
    iEngine.Sink().OutputLineFormattedL( KFmtTagOpenAndClose, &KFmtNameProcess, aIndex, &aProcessName, &KFmtNameProcess, aIndex );
hgs
parents:
diff changeset
   477
    
hgs
parents:
diff changeset
   478
    //      <CHUNK_NAME_001>Local-c812ba58</CHUNK_NAME_001>
hgs
parents:
diff changeset
   479
    const TPtrC pChunkName( rHeapMetaData.ChunkName() );
hgs
parents:
diff changeset
   480
    iEngine.Sink().OutputLineFormattedL( KFmtTagOpenAndClose, &KFmtNameChunk, aIndex, &pChunkName, &KFmtNameChunk, aIndex );
hgs
parents:
diff changeset
   481
    
hgs
parents:
diff changeset
   482
    // Fields
hgs
parents:
diff changeset
   483
    iEngine.Sink().OutputLineFormattedL( KFmtFieldContent,
hgs
parents:
diff changeset
   484
                                         &KFmtFields,
hgs
parents:
diff changeset
   485
                                         aIndex,
hgs
parents:
diff changeset
   486
                                         aInfo.Tid(),
hgs
parents:
diff changeset
   487
                                         rHeapMetaData.ChunkHandle(),
hgs
parents:
diff changeset
   488
                                         rHeapMetaData.iAllocatorAddress,
hgs
parents:
diff changeset
   489
                                         rHeapMetaData.iHeapSize,
hgs
parents:
diff changeset
   490
                                         rHeapMetaData.iMinHeapSize,
hgs
parents:
diff changeset
   491
                                         rHeapMetaData.iMaxHeapSize,
hgs
parents:
diff changeset
   492
                                         NULL, // there's no longer a free list so we can't return the next ptr
hgs
parents:
diff changeset
   493
                                         0, // there's no longer a free list so we can't return it's length
hgs
parents:
diff changeset
   494
                                         rHeapStats.StatsFree().TypeCount(),
hgs
parents:
diff changeset
   495
                                         rHeapStats.StatsFree().TypeSize(),
hgs
parents:
diff changeset
   496
                                         rHeapStats.StatsFree().SlackSpaceCellSize(),
hgs
parents:
diff changeset
   497
                                         rHeapStats.StatsFree().LargestCellSize(),
hgs
parents:
diff changeset
   498
                                         rHeapStats.StatsAllocated().LargestCellSize(),
hgs
parents:
diff changeset
   499
                                         rHeapStats.StatsAllocated().TypeCount(),
hgs
parents:
diff changeset
   500
                                         0, // min cell no longer makes sense
hgs
parents:
diff changeset
   501
                                         rHeapStats.StatsAllocated().TypeSize(),
hgs
parents:
diff changeset
   502
                                         rHeapMetaData.IsSharedHeap(),
hgs
parents:
diff changeset
   503
                                         &KFmtFields,
hgs
parents:
diff changeset
   504
                                         aIndex
hgs
parents:
diff changeset
   505
                                         );
hgs
parents:
diff changeset
   506
    
hgs
parents:
diff changeset
   507
    // </ENTRY_001>
hgs
parents:
diff changeset
   508
    iEngine.Sink().OutputLineFormattedL( KFmtEntryId, &KMemSpySinkTagClose, aIndex );
hgs
parents:
diff changeset
   509
    }
hgs
parents:
diff changeset
   510
hgs
parents:
diff changeset
   511
hgs
parents:
diff changeset
   512
hgs
parents:
diff changeset
   513
EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapInfoForDeviceL( TBool aIncludeKernel )
hgs
parents:
diff changeset
   514
    {
hgs
parents:
diff changeset
   515
    // NB: The goal here is to minimise the line length. We already look like we
hgs
parents:
diff changeset
   516
    // could exceed the available RDebug::Print length...
hgs
parents:
diff changeset
   517
    const TInt count = iEngine.Container().Count();
hgs
parents:
diff changeset
   518
    TInt index = 0;
hgs
parents:
diff changeset
   519
    //
hgs
parents:
diff changeset
   520
    HBufC* buf = HBufC::NewLC( 1024 );
hgs
parents:
diff changeset
   521
    TPtr pBuf(buf->Des());
hgs
parents:
diff changeset
   522
    //
hgs
parents:
diff changeset
   523
    _LIT( KMemSpyFolder, "Heap\\Compact" );
hgs
parents:
diff changeset
   524
    _LIT( KMemSpyContext, "Heap Compact" );
hgs
parents:
diff changeset
   525
    _LIT( KMemSpyExtension, ".log" );
hgs
parents:
diff changeset
   526
    iEngine.Sink().DataStreamBeginL( KMemSpyContext, KMemSpyFolder, KMemSpyExtension );
hgs
parents:
diff changeset
   527
hgs
parents:
diff changeset
   528
    // Start marker
hgs
parents:
diff changeset
   529
    iEngine.Sink().OutputLineFormattedL( KMemSpyMarkerCSV, &KNullDesC );
hgs
parents:
diff changeset
   530
hgs
parents:
diff changeset
   531
    // Set overall prefix
hgs
parents:
diff changeset
   532
    iEngine.Sink().OutputPrefixSetLC( KMemSpyPrefixCSV );
hgs
parents:
diff changeset
   533
    
hgs
parents:
diff changeset
   534
    // Output version info
hgs
parents:
diff changeset
   535
    _LIT( KVersionNumber, "<VERSION>1</VERSION>" );
hgs
parents:
diff changeset
   536
    iEngine.Sink().OutputLineL( KVersionNumber );
hgs
parents:
diff changeset
   537
    
hgs
parents:
diff changeset
   538
    // Output time stamp
hgs
parents:
diff changeset
   539
    _LIT( KTimeStamp, "<TIMESTAMP>%u</TIMESTAMP>" );
hgs
parents:
diff changeset
   540
    iEngine.Sink().OutputLineFormattedL( KTimeStamp, User::FastCounter() );
hgs
parents:
diff changeset
   541
 
hgs
parents:
diff changeset
   542
    // Heap info we'll populate by calling the driver
hgs
parents:
diff changeset
   543
    TMemSpyHeapInfo info;
hgs
parents:
diff changeset
   544
    TFullName processName;
hgs
parents:
diff changeset
   545
hgs
parents:
diff changeset
   546
    if  ( aIncludeKernel )
hgs
parents:
diff changeset
   547
        {
hgs
parents:
diff changeset
   548
        // Get kernel heap info
hgs
parents:
diff changeset
   549
        GetHeapInfoKernelL( info );
hgs
parents:
diff changeset
   550
hgs
parents:
diff changeset
   551
        if ( info.Type() != TMemSpyHeapInfo::ETypeUnknown )
hgs
parents:
diff changeset
   552
            {
hgs
parents:
diff changeset
   553
            TName threadName;
hgs
parents:
diff changeset
   554
            MemSpyEngineUtils::GetKernelHeapThreadAndProcessNames( threadName, processName );
hgs
parents:
diff changeset
   555
            OutputCSVEntryL( index++, info, threadName, processName );
hgs
parents:
diff changeset
   556
            }
hgs
parents:
diff changeset
   557
        }
hgs
parents:
diff changeset
   558
hgs
parents:
diff changeset
   559
	for(TInt ii=0; ii<count; ii++)
hgs
parents:
diff changeset
   560
        {
hgs
parents:
diff changeset
   561
        const CMemSpyProcess& process = iEngine.Container().At( ii );
hgs
parents:
diff changeset
   562
        process.FullName( processName );
hgs
parents:
diff changeset
   563
        //
hgs
parents:
diff changeset
   564
        if  ( iEngine.ProcessSuspendAndGetErrorLC( process.Id() ) == KErrNone )
hgs
parents:
diff changeset
   565
            {
hgs
parents:
diff changeset
   566
            const TInt threadCount = process.Count();
hgs
parents:
diff changeset
   567
            //
hgs
parents:
diff changeset
   568
            for(TInt j=0; j<threadCount; j++)
hgs
parents:
diff changeset
   569
                {
hgs
parents:
diff changeset
   570
                const CMemSpyThread& thread = process.At( j );
hgs
parents:
diff changeset
   571
                const TPtrC threadName( thread.Name() );
hgs
parents:
diff changeset
   572
                //
hgs
parents:
diff changeset
   573
                const TInt error = iEngine.Driver().GetHeapInfoUser( info, thread.Id() );
hgs
parents:
diff changeset
   574
                if ( error == KErrNone )
hgs
parents:
diff changeset
   575
                    {
hgs
parents:
diff changeset
   576
                    UpdateSharedHeapInfoL( process.Id(), thread.Id(), info );
hgs
parents:
diff changeset
   577
                    }
hgs
parents:
diff changeset
   578
                if  ( error == KErrNone && info.Type() != TMemSpyHeapInfo::ETypeUnknown )
hgs
parents:
diff changeset
   579
                    {
hgs
parents:
diff changeset
   580
                    OutputCSVEntryL( index++, info, threadName, processName );
hgs
parents:
diff changeset
   581
                    }
hgs
parents:
diff changeset
   582
                }
hgs
parents:
diff changeset
   583
    
hgs
parents:
diff changeset
   584
            CleanupStack::PopAndDestroy(); // ProcessSuspendLC
hgs
parents:
diff changeset
   585
            }
hgs
parents:
diff changeset
   586
        }
hgs
parents:
diff changeset
   587
hgs
parents:
diff changeset
   588
    CleanupStack::PopAndDestroy(); // clear prefix
hgs
parents:
diff changeset
   589
    CleanupStack::PopAndDestroy( buf );
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
	// End marker
hgs
parents:
diff changeset
   592
	iEngine.Sink().OutputLineFormattedL( KMemSpyMarkerCSV, &KMemSpySinkTagClose );
hgs
parents:
diff changeset
   593
    iEngine.Sink().DataStreamEndL();
hgs
parents:
diff changeset
   594
    }
hgs
parents:
diff changeset
   595
hgs
parents:
diff changeset
   596
hgs
parents:
diff changeset
   597
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
hgs
parents:
diff changeset
   600
hgs
parents:
diff changeset
   601
hgs
parents:
diff changeset
   602
hgs
parents:
diff changeset
   603
hgs
parents:
diff changeset
   604
hgs
parents:
diff changeset
   605
hgs
parents:
diff changeset
   606
hgs
parents:
diff changeset
   607
hgs
parents:
diff changeset
   608
52
hgs
parents: 51
diff changeset
   609
EXPORT_C void CMemSpyEngineHelperHeap::GetHeapInfoUserL(const TProcessId& aProcess, 
hgs
parents: 51
diff changeset
   610
                                                        const TThreadId& aThread, 
hgs
parents: 51
diff changeset
   611
                                                        TMemSpyHeapInfo& aInfo, 
hgs
parents: 51
diff changeset
   612
                                                        RArray<TMemSpyDriverFreeCell>* aFreeCells)
51
hgs
parents:
diff changeset
   613
    {
hgs
parents:
diff changeset
   614
	GetHeapInfoUserL(aProcess, aThread, aInfo, aFreeCells, EFalse);
hgs
parents:
diff changeset
   615
	}
hgs
parents:
diff changeset
   616
52
hgs
parents: 51
diff changeset
   617
EXPORT_C void CMemSpyEngineHelperHeap::GetHeapInfoUserL(const TProcessId& aProcess, 
hgs
parents: 51
diff changeset
   618
                                                        const TThreadId& aThread, 
hgs
parents: 51
diff changeset
   619
                                                        TMemSpyHeapInfo& aInfo, 
hgs
parents: 51
diff changeset
   620
                                                        RArray<TMemSpyDriverCell>* aCells, 
hgs
parents: 51
diff changeset
   621
                                                        TBool aCollectAllocatedCellsAsWellAsFree)
51
hgs
parents:
diff changeset
   622
    {
hgs
parents:
diff changeset
   623
    iEngine.ProcessSuspendLC( aProcess );
hgs
parents:
diff changeset
   624
    TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::GetHeapInfoUserL() - checksum1: 0x%08x", aInfo.AsRHeap().Statistics().StatsFree().Checksum() ) );
hgs
parents:
diff changeset
   625
    
hgs
parents:
diff changeset
   626
    TInt r = KErrNone;
hgs
parents:
diff changeset
   627
    //
hgs
parents:
diff changeset
   628
    if  (aCells)
hgs
parents:
diff changeset
   629
        {
hgs
parents:
diff changeset
   630
        r = iEngine.Driver().GetHeapInfoUser( aInfo, aThread, *aCells, aCollectAllocatedCellsAsWellAsFree);
hgs
parents:
diff changeset
   631
        }
hgs
parents:
diff changeset
   632
    else
hgs
parents:
diff changeset
   633
        {
hgs
parents:
diff changeset
   634
        r = iEngine.Driver().GetHeapInfoUser( aInfo, aThread );
hgs
parents:
diff changeset
   635
        }
hgs
parents:
diff changeset
   636
    if ( !r )
hgs
parents:
diff changeset
   637
        {
hgs
parents:
diff changeset
   638
        UpdateSharedHeapInfoL( aProcess, aThread, aInfo );
hgs
parents:
diff changeset
   639
        }
hgs
parents:
diff changeset
   640
    
hgs
parents:
diff changeset
   641
    //
hgs
parents:
diff changeset
   642
    TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::GetHeapInfoUserL() - checksum2: 0x%08x", aInfo.AsRHeap().Statistics().StatsFree().Checksum() ) );
hgs
parents:
diff changeset
   643
    CleanupStack::PopAndDestroy(); // ProcessSuspendLC
hgs
parents:
diff changeset
   644
    User::LeaveIfError( r );
hgs
parents:
diff changeset
   645
    }
hgs
parents:
diff changeset
   646
hgs
parents:
diff changeset
   647
52
hgs
parents: 51
diff changeset
   648
EXPORT_C void CMemSpyEngineHelperHeap::GetHeapInfoUserL(const CMemSpyProcess& aProcess, 
hgs
parents: 51
diff changeset
   649
                                                        RArray<TMemSpyHeapInfo >& aInfos)
51
hgs
parents:
diff changeset
   650
    {
hgs
parents:
diff changeset
   651
    aInfos.Reset();
hgs
parents:
diff changeset
   652
    iEngine.ProcessSuspendLC( aProcess.Id() );
hgs
parents:
diff changeset
   653
    //
hgs
parents:
diff changeset
   654
    TMemSpyHeapInfo info;
hgs
parents:
diff changeset
   655
    //
hgs
parents:
diff changeset
   656
    const TInt count = aProcess.Count();
hgs
parents:
diff changeset
   657
    for( TInt i=0; i<count; i++ )
hgs
parents:
diff changeset
   658
        {
hgs
parents:
diff changeset
   659
        const CMemSpyThread& thread = aProcess.At( i );
hgs
parents:
diff changeset
   660
        //
hgs
parents:
diff changeset
   661
        GetHeapInfoUserL( aProcess.Id(), thread.Id(), info );
hgs
parents:
diff changeset
   662
        aInfos.AppendL( info );
hgs
parents:
diff changeset
   663
        }
hgs
parents:
diff changeset
   664
    //
hgs
parents:
diff changeset
   665
    CleanupStack::PopAndDestroy(); // ProcessSuspendLC
hgs
parents:
diff changeset
   666
    }
hgs
parents:
diff changeset
   667
hgs
parents:
diff changeset
   668
hgs
parents:
diff changeset
   669
EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapInfoUserL( const CMemSpyThread& aThread )
hgs
parents:
diff changeset
   670
    {
hgs
parents:
diff changeset
   671
    HBufC* threadName = aThread.FullName().AllocLC();
hgs
parents:
diff changeset
   672
    //
hgs
parents:
diff changeset
   673
    RArray<TMemSpyDriverFreeCell> freeCells;
hgs
parents:
diff changeset
   674
    CleanupClosePushL( freeCells );
hgs
parents:
diff changeset
   675
    //
hgs
parents:
diff changeset
   676
    TMemSpyHeapInfo info;
hgs
parents:
diff changeset
   677
    GetHeapInfoUserL( aThread.Process().Id(), aThread.Id(), info, &freeCells );
hgs
parents:
diff changeset
   678
    OutputHeapInfoL( info, *threadName, &freeCells );
hgs
parents:
diff changeset
   679
    //
hgs
parents:
diff changeset
   680
    CleanupStack::PopAndDestroy( 2, threadName ); // freecells & thread name
hgs
parents:
diff changeset
   681
    }
hgs
parents:
diff changeset
   682
hgs
parents:
diff changeset
   683
hgs
parents:
diff changeset
   684
hgs
parents:
diff changeset
   685
hgs
parents:
diff changeset
   686
hgs
parents:
diff changeset
   687
hgs
parents:
diff changeset
   688
hgs
parents:
diff changeset
   689
hgs
parents:
diff changeset
   690
hgs
parents:
diff changeset
   691
hgs
parents:
diff changeset
   692
hgs
parents:
diff changeset
   693
hgs
parents:
diff changeset
   694
hgs
parents:
diff changeset
   695
hgs
parents:
diff changeset
   696
hgs
parents:
diff changeset
   697
52
hgs
parents: 51
diff changeset
   698
EXPORT_C void CMemSpyEngineHelperHeap::GetHeapInfoKernelL( TMemSpyHeapInfo& aInfo, 
hgs
parents: 51
diff changeset
   699
                                                           RArray<TMemSpyDriverFreeCell>* aFreeCells )
hgs
parents: 51
diff changeset
   700
    {
hgs
parents: 51
diff changeset
   701
    GetHeapInfoKernelL(aInfo, aFreeCells, EFalse, EFalse);
hgs
parents: 51
diff changeset
   702
    }
51
hgs
parents:
diff changeset
   703
52
hgs
parents: 51
diff changeset
   704
EXPORT_C void CMemSpyEngineHelperHeap::GetHeapInfoKernelL( TMemSpyHeapInfo& aInfo, 
hgs
parents: 51
diff changeset
   705
                                                           RArray<TMemSpyDriverFreeCell>* aFreeCells, 
hgs
parents: 51
diff changeset
   706
                                                           TBool aCollectAllocatedCellsAsWellAsFree )
hgs
parents: 51
diff changeset
   707
    {
hgs
parents: 51
diff changeset
   708
    GetHeapInfoKernelL(aInfo, aFreeCells, aCollectAllocatedCellsAsWellAsFree, EFalse);
hgs
parents: 51
diff changeset
   709
    }
hgs
parents: 51
diff changeset
   710
hgs
parents: 51
diff changeset
   711
void CMemSpyEngineHelperHeap::GetHeapInfoKernelL( TMemSpyHeapInfo& aInfo, 
hgs
parents: 51
diff changeset
   712
                                                  RArray<TMemSpyDriverFreeCell>* aFreeCells, 
hgs
parents: 51
diff changeset
   713
                                                  TBool aCollectAllocatedCellsAsWellAsFree, 
hgs
parents: 51
diff changeset
   714
                                                  TBool aUseKernelCopy )
51
hgs
parents:
diff changeset
   715
    {
hgs
parents:
diff changeset
   716
    TInt error = KErrNone;
hgs
parents:
diff changeset
   717
    //
hgs
parents:
diff changeset
   718
    if  ( aFreeCells )
hgs
parents:
diff changeset
   719
        {
52
hgs
parents: 51
diff changeset
   720
        error = iEngine.Driver().GetHeapInfoKernel( aInfo, 
hgs
parents: 51
diff changeset
   721
                                                    *aFreeCells, 
hgs
parents: 51
diff changeset
   722
                                                    aCollectAllocatedCellsAsWellAsFree, 
hgs
parents: 51
diff changeset
   723
                                                    aUseKernelCopy );
51
hgs
parents:
diff changeset
   724
        }
hgs
parents:
diff changeset
   725
    else
hgs
parents:
diff changeset
   726
        {
hgs
parents:
diff changeset
   727
        error = iEngine.Driver().GetHeapInfoKernel( aInfo );
hgs
parents:
diff changeset
   728
        }
hgs
parents:
diff changeset
   729
    //
hgs
parents:
diff changeset
   730
    User::LeaveIfError( error );
hgs
parents:
diff changeset
   731
    }
hgs
parents:
diff changeset
   732
hgs
parents:
diff changeset
   733
hgs
parents:
diff changeset
   734
EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapInfoKernelL()
hgs
parents:
diff changeset
   735
    {
hgs
parents:
diff changeset
   736
    // Get thread name
hgs
parents:
diff changeset
   737
    TFullName threadName;
hgs
parents:
diff changeset
   738
    MemSpyEngineUtils::GetKernelHeapThreadName( threadName );
hgs
parents:
diff changeset
   739
hgs
parents:
diff changeset
   740
    // Free cells
hgs
parents:
diff changeset
   741
    RArray<TMemSpyDriverFreeCell> freeCells;
hgs
parents:
diff changeset
   742
    CleanupClosePushL( freeCells );
hgs
parents:
diff changeset
   743
hgs
parents:
diff changeset
   744
    // Get info
hgs
parents:
diff changeset
   745
    TMemSpyHeapInfo info;
hgs
parents:
diff changeset
   746
    GetHeapInfoKernelL( info, &freeCells );
hgs
parents:
diff changeset
   747
hgs
parents:
diff changeset
   748
    // Ouput
hgs
parents:
diff changeset
   749
    OutputHeapInfoL( info, threadName, &freeCells );
hgs
parents:
diff changeset
   750
hgs
parents:
diff changeset
   751
    CleanupStack::PopAndDestroy( &freeCells );
hgs
parents:
diff changeset
   752
    }
hgs
parents:
diff changeset
   753
hgs
parents:
diff changeset
   754
hgs
parents:
diff changeset
   755
EXPORT_C void CMemSpyEngineHelperHeap::OutputHeapDataKernelL()
hgs
parents:
diff changeset
   756
    {
hgs
parents:
diff changeset
   757
    OutputHeapDataKernelL( KMemSpyHeapDumpCreateOwnDataStream );
hgs
parents:
diff changeset
   758
    }
hgs
parents:
diff changeset
   759
hgs
parents:
diff changeset
   760
52
hgs
parents: 51
diff changeset
   761
void CMemSpyEngineHelperHeap::CleanupHeapDataKernel( TAny* aPtr )
hgs
parents: 51
diff changeset
   762
    {
hgs
parents: 51
diff changeset
   763
    if ( aPtr )
hgs
parents: 51
diff changeset
   764
        {
hgs
parents: 51
diff changeset
   765
        CMemSpyEngineHelperHeap* ptr = static_cast<CMemSpyEngineHelperHeap*>( aPtr );
hgs
parents: 51
diff changeset
   766
        (void) ptr->iEngine.Driver().FreeHeapDataKernel();
hgs
parents: 51
diff changeset
   767
        }
hgs
parents: 51
diff changeset
   768
    }
hgs
parents: 51
diff changeset
   769
51
hgs
parents:
diff changeset
   770
void CMemSpyEngineHelperHeap::OutputHeapDataKernelL( TBool aCreateDataStream )
hgs
parents:
diff changeset
   771
    {
52
hgs
parents: 51
diff changeset
   772
    User::LeaveIfError(iEngine.Driver().CopyHeapDataKernel());
hgs
parents: 51
diff changeset
   773
    TCleanupItem item = TCleanupItem(CleanupHeapDataKernel, this);
hgs
parents: 51
diff changeset
   774
    CleanupStack::PushL(item);
hgs
parents: 51
diff changeset
   775
    
hgs
parents: 51
diff changeset
   776
    // Get the heap info, including cell information
hgs
parents: 51
diff changeset
   777
    RArray<TMemSpyDriverCell> cells;
hgs
parents: 51
diff changeset
   778
    CleanupClosePushL( cells );
hgs
parents: 51
diff changeset
   779
    
hgs
parents: 51
diff changeset
   780
    TMemSpyHeapInfo heapInfo;
hgs
parents: 51
diff changeset
   781
    TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::OutputHeapDataKernelL() - checksum before: 0x%08x", 
hgs
parents: 51
diff changeset
   782
                           heapInfo.AsRHeap().Statistics().StatsFree().Checksum() ) );
hgs
parents: 51
diff changeset
   783
    GetHeapInfoKernelL(heapInfo, &cells, ETrue, ETrue);
hgs
parents: 51
diff changeset
   784
    TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::OutputHeapDataKernelL() - checksum after: 0x%08x", 
hgs
parents: 51
diff changeset
   785
                           heapInfo.AsRHeap().Statistics().StatsFree().Checksum() ) );
hgs
parents: 51
diff changeset
   786
hgs
parents: 51
diff changeset
   787
    // Output the heap data
hgs
parents: 51
diff changeset
   788
    OutputHeapDataKernelL( heapInfo, aCreateDataStream, &cells );
hgs
parents: 51
diff changeset
   789
    
hgs
parents: 51
diff changeset
   790
    CleanupStack::PopAndDestroy( &cells );
54
hgs
parents: 52
diff changeset
   791
    CleanupStack::PopAndDestroy( this ); // runs CleanupHeapDataKernel
52
hgs
parents: 51
diff changeset
   792
    }    
hgs
parents: 51
diff changeset
   793
hgs
parents: 51
diff changeset
   794
void CMemSpyEngineHelperHeap::OutputHeapDataKernelL(const TMemSpyHeapInfo& aHeapInfo, 
hgs
parents: 51
diff changeset
   795
                                                    TBool aCreateDataStream, 
hgs
parents: 51
diff changeset
   796
                                                    const RArray<TMemSpyDriverCell>* aCells)
hgs
parents: 51
diff changeset
   797
    {
51
hgs
parents:
diff changeset
   798
    TFullName threadName;
hgs
parents:
diff changeset
   799
    MemSpyEngineUtils::GetKernelHeapThreadName( threadName, EFalse );
hgs
parents:
diff changeset
   800
hgs
parents:
diff changeset
   801
    // Begin a new data stream
hgs
parents:
diff changeset
   802
    if  ( aCreateDataStream )
hgs
parents:
diff changeset
   803
        {
hgs
parents:
diff changeset
   804
        _LIT( KMemSpyFolder, "Heap\\Data" );
hgs
parents:
diff changeset
   805
        _LIT( KMemSpyContext, "Heap Data - %S" );
hgs
parents:
diff changeset
   806
        HBufC* context = HBufC::NewLC( KMaxFileName );
hgs
parents:
diff changeset
   807
        TPtr pContext( context->Des() );
hgs
parents:
diff changeset
   808
        pContext.Format( KMemSpyContext, &threadName );
hgs
parents:
diff changeset
   809
        iEngine.Sink().DataStreamBeginL( pContext, KMemSpyFolder );
hgs
parents:
diff changeset
   810
        CleanupStack::PopAndDestroy( context );
hgs
parents:
diff changeset
   811
        }
hgs
parents:
diff changeset
   812
52
hgs
parents: 51
diff changeset
   813
    TBuf<KMaxFullName + 100> printFormat;
51
hgs
parents:
diff changeset
   814
hgs
parents:
diff changeset
   815
    // Start marker
52
hgs
parents: 51
diff changeset
   816
    iEngine.Sink().OutputLineFormattedL( KMemSpyMarkerHeapData, &KNullDesC, aHeapInfo.Tid() );
51
hgs
parents:
diff changeset
   817
hgs
parents:
diff changeset
   818
    // Set overall prefix
hgs
parents:
diff changeset
   819
    iEngine.Sink().OutputPrefixSetFormattedLC( KMemSpyPrefixHeapData, &threadName );
hgs
parents:
diff changeset
   820
hgs
parents:
diff changeset
   821
    // Info section
52
hgs
parents: 51
diff changeset
   822
    OutputHeapInfoL( aHeapInfo, threadName, aCells );
hgs
parents: 51
diff changeset
   823
hgs
parents: 51
diff changeset
   824
    // Code segments (needed for map file reading...)
hgs
parents: 51
diff changeset
   825
    _LIT(KCellListCodeSegInfoFormat, "CodeSegs - ");
hgs
parents: 51
diff changeset
   826
    iEngine.HelperCodeSegment().OutputCodeSegmentsL( aHeapInfo.Pid(), printFormat, KCellListCodeSegInfoFormat, '-', ETrue );
51
hgs
parents:
diff changeset
   827
hgs
parents:
diff changeset
   828
    // Dump section
hgs
parents:
diff changeset
   829
    _LIT(KHeaderDump, "Heap Data");
hgs
parents:
diff changeset
   830
    iEngine.Sink().OutputSectionHeadingL( KHeaderDump, '-' );
hgs
parents:
diff changeset
   831
52
hgs
parents: 51
diff changeset
   832
    HBufC8* data = HBufC8::NewLC( 4096 * 12 );
hgs
parents: 51
diff changeset
   833
    TPtr8 pData(data->Des());
hgs
parents: 51
diff changeset
   834
    TUint remaining = 0;
hgs
parents: 51
diff changeset
   835
    TUint readAddress = 0;
hgs
parents: 51
diff changeset
   836
hgs
parents: 51
diff changeset
   837
    TInt r = iEngine.Driver().GetHeapDataKernel(aHeapInfo.Tid(), pData, readAddress, remaining);
hgs
parents: 51
diff changeset
   838
    TUint prevEndAddress = readAddress + pData.Length();
hgs
parents: 51
diff changeset
   839
    if (r == KErrNone)
hgs
parents: 51
diff changeset
   840
        {
hgs
parents: 51
diff changeset
   841
        while (r == KErrNone)
hgs
parents: 51
diff changeset
   842
            {
hgs
parents: 51
diff changeset
   843
            if (readAddress > prevEndAddress)
hgs
parents: 51
diff changeset
   844
                {
hgs
parents: 51
diff changeset
   845
                // We've hit a discontinuity, ie one or more unmapped pages
hgs
parents: 51
diff changeset
   846
                _LIT(KBreak, "........");
hgs
parents: 51
diff changeset
   847
                iEngine.Sink().OutputLineL(KBreak);
hgs
parents: 51
diff changeset
   848
                }
hgs
parents: 51
diff changeset
   849
            _LIT(KHeapDumpDataFormat, "%S");
hgs
parents: 51
diff changeset
   850
            iEngine.Sink().OutputBinaryDataL(KHeapDumpDataFormat, pData.Ptr(), (const TUint8*) readAddress, pData.Length());
hgs
parents: 51
diff changeset
   851
            readAddress += pData.Length();
hgs
parents: 51
diff changeset
   852
            if (remaining > 0)
hgs
parents: 51
diff changeset
   853
                {
hgs
parents: 51
diff changeset
   854
                prevEndAddress = readAddress;
hgs
parents: 51
diff changeset
   855
                r = iEngine.Driver().GetHeapDataKernelNext(aHeapInfo.Tid(), pData, readAddress, remaining);
hgs
parents: 51
diff changeset
   856
                }
hgs
parents: 51
diff changeset
   857
            else
hgs
parents: 51
diff changeset
   858
                break;
hgs
parents: 51
diff changeset
   859
            }
hgs
parents: 51
diff changeset
   860
        }
hgs
parents: 51
diff changeset
   861
    else
hgs
parents: 51
diff changeset
   862
        {
hgs
parents: 51
diff changeset
   863
        _LIT( KHeapFetchError, "Heap error: %d");
hgs
parents: 51
diff changeset
   864
        iEngine.Sink().OutputLineFormattedL( KHeapFetchError, r );
hgs
parents: 51
diff changeset
   865
        }
hgs
parents: 51
diff changeset
   866
hgs
parents: 51
diff changeset
   867
    CleanupStack::PopAndDestroy( data );
51
hgs
parents:
diff changeset
   868
hgs
parents:
diff changeset
   869
    CleanupStack::PopAndDestroy(); // clear prefix
hgs
parents:
diff changeset
   870
hgs
parents:
diff changeset
   871
    // End marker
52
hgs
parents: 51
diff changeset
   872
    iEngine.Sink().OutputLineFormattedL( KMemSpyMarkerHeapData, &KMemSpySinkTagClose, aHeapInfo.Tid() );
51
hgs
parents:
diff changeset
   873
hgs
parents:
diff changeset
   874
    if  ( aCreateDataStream )
hgs
parents:
diff changeset
   875
        {
hgs
parents:
diff changeset
   876
        iEngine.Sink().DataStreamEndL();
hgs
parents:
diff changeset
   877
        }
hgs
parents:
diff changeset
   878
    }
hgs
parents:
diff changeset
   879
hgs
parents:
diff changeset
   880
hgs
parents:
diff changeset
   881
hgs
parents:
diff changeset
   882
hgs
parents:
diff changeset
   883
hgs
parents:
diff changeset
   884
hgs
parents:
diff changeset
   885
hgs
parents:
diff changeset
   886
hgs
parents:
diff changeset
   887
hgs
parents:
diff changeset
   888
hgs
parents:
diff changeset
   889
hgs
parents:
diff changeset
   890
hgs
parents:
diff changeset
   891
hgs
parents:
diff changeset
   892
hgs
parents:
diff changeset
   893
hgs
parents:
diff changeset
   894
hgs
parents:
diff changeset
   895
hgs
parents:
diff changeset
   896
hgs
parents:
diff changeset
   897
hgs
parents:
diff changeset
   898
hgs
parents:
diff changeset
   899
hgs
parents:
diff changeset
   900
hgs
parents:
diff changeset
   901
hgs
parents:
diff changeset
   902
hgs
parents:
diff changeset
   903
hgs
parents:
diff changeset
   904
hgs
parents:
diff changeset
   905
hgs
parents:
diff changeset
   906
hgs
parents:
diff changeset
   907
hgs
parents:
diff changeset
   908
hgs
parents:
diff changeset
   909
hgs
parents:
diff changeset
   910
hgs
parents:
diff changeset
   911
EXPORT_C CMemSpyEngineOutputList* CMemSpyEngineHelperHeap::NewHeapSummaryShortLC( const TMemSpyHeapInfo& aInfo )
hgs
parents:
diff changeset
   912
    {
hgs
parents:
diff changeset
   913
    CMemSpyEngineOutputList* list = CMemSpyEngineOutputList::NewLC( iEngine.Sink() );
hgs
parents:
diff changeset
   914
hgs
parents:
diff changeset
   915
    // Heap type
hgs
parents:
diff changeset
   916
    _LIT( KItem0, "Heap type" );
hgs
parents:
diff changeset
   917
    if ( aInfo.Type() == TMemSpyHeapInfo::ETypeUnknown )
hgs
parents:
diff changeset
   918
        {
hgs
parents:
diff changeset
   919
        _LIT( KItem0_Type_Unknown, "Unknown" );
hgs
parents:
diff changeset
   920
        list->AddItemL( KItem0, KItem0_Type_Unknown );
hgs
parents:
diff changeset
   921
        }
hgs
parents:
diff changeset
   922
    else
hgs
parents:
diff changeset
   923
        {
hgs
parents:
diff changeset
   924
        const TMemSpyHeapInfoRHeap& rHeap = aInfo.AsRHeap();
hgs
parents:
diff changeset
   925
        const TMemSpyHeapMetaDataRHeap& metaData = rHeap.MetaData();
hgs
parents:
diff changeset
   926
        const TMemSpyHeapStatisticsRHeap& statistics = rHeap.Statistics();
hgs
parents:
diff changeset
   927
hgs
parents:
diff changeset
   928
        _LIT( KItem0_Type_RHeap, "RHeap" );
hgs
parents:
diff changeset
   929
        _LIT( KItem0_Type_RHybridHeap, "RHybridHeap" );
hgs
parents:
diff changeset
   930
		if (aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap)
hgs
parents:
diff changeset
   931
			{
hgs
parents:
diff changeset
   932
	        list->AddItemL( KItem0, KItem0_Type_RHeap );
hgs
parents:
diff changeset
   933
			}
hgs
parents:
diff changeset
   934
		else
hgs
parents:
diff changeset
   935
			{
hgs
parents:
diff changeset
   936
	        list->AddItemL( KItem0, KItem0_Type_RHybridHeap );
hgs
parents:
diff changeset
   937
			}
hgs
parents:
diff changeset
   938
hgs
parents:
diff changeset
   939
        // Heap size is the size of the heap minus the size of the embedded (in-place) RHeap. 
hgs
parents:
diff changeset
   940
        _LIT( KItem1, "Heap size" );
hgs
parents:
diff changeset
   941
        list->AddItemL(KItem1, metaData.iHeapSize);
hgs
parents:
diff changeset
   942
hgs
parents:
diff changeset
   943
        _LIT( KItem8b, "Allocator address" );
hgs
parents:
diff changeset
   944
        list->AddItemHexL( KItem8b, (TUint)metaData.iAllocatorAddress );
hgs
parents:
diff changeset
   945
        
hgs
parents:
diff changeset
   946
        _LIT( KItem1b, "Shared" );
hgs
parents:
diff changeset
   947
        list->AddItemYesNoL( KItem1b, metaData.IsSharedHeap() );
hgs
parents:
diff changeset
   948
hgs
parents:
diff changeset
   949
        // This is the size (rounded to the page) of memory associated with
hgs
parents:
diff changeset
   950
        // the underlying heap chunk
hgs
parents:
diff changeset
   951
        _LIT( KItem2, "Chunk size" );
hgs
parents:
diff changeset
   952
        list->AddItemL( KItem2, metaData.ChunkSize() );
hgs
parents:
diff changeset
   953
hgs
parents:
diff changeset
   954
        _LIT( KItem3, "Alloc. count" );
hgs
parents:
diff changeset
   955
        list->AddItemL( KItem3, statistics.StatsAllocated().TypeCount() );
hgs
parents:
diff changeset
   956
hgs
parents:
diff changeset
   957
        _LIT( KItem4, "Free. count" );
hgs
parents:
diff changeset
   958
        list->AddItemL( KItem4, statistics.StatsFree().TypeCount() );
hgs
parents:
diff changeset
   959
hgs
parents:
diff changeset
   960
        _LIT( KItem5, "Biggest alloc." );
hgs
parents:
diff changeset
   961
        list->AddItemL( KItem5, statistics.StatsAllocated().LargestCellSize() );
hgs
parents:
diff changeset
   962
hgs
parents:
diff changeset
   963
        _LIT( KItem6, "Biggest free" );
hgs
parents:
diff changeset
   964
        list->AddItemL( KItem6, statistics.StatsFree().LargestCellSize() );
hgs
parents:
diff changeset
   965
hgs
parents:
diff changeset
   966
        _LIT( KItem6a, "Total alloc." );
hgs
parents:
diff changeset
   967
        list->AddItemL( KItem6a, statistics.StatsAllocated().TypeSize() );
hgs
parents:
diff changeset
   968
hgs
parents:
diff changeset
   969
        _LIT( KItem6b, "Total free" );
hgs
parents:
diff changeset
   970
        list->AddItemL( KItem6b, statistics.StatsFree().TypeSize() );
hgs
parents:
diff changeset
   971
hgs
parents:
diff changeset
   972
        // Slack is the free space at the end of the heap
hgs
parents:
diff changeset
   973
        _LIT( KItem7, "Slack free space" );
hgs
parents:
diff changeset
   974
        list->AddItemL( KItem7, statistics.StatsFree().SlackSpaceCellSize() );
hgs
parents:
diff changeset
   975
hgs
parents:
diff changeset
   976
        // Fragmentation is a measurement of free space scattered throughout the heap, but ignoring
hgs
parents:
diff changeset
   977
        // any slack space at the end (which can often be recovered, to the granularity of one page of ram)
hgs
parents:
diff changeset
   978
        _LIT( KItem8a, "Fragmentation" );
hgs
parents:
diff changeset
   979
        list->AddItemPercentageL( KItem8a, metaData.iHeapSize, ( statistics.StatsFree().TypeSize()  - statistics.StatsFree().SlackSpaceCellSize() ) );
hgs
parents:
diff changeset
   980
hgs
parents:
diff changeset
   981
hgs
parents:
diff changeset
   982
        _LIT( KItem9c, "Overhead (total)" );
hgs
parents:
diff changeset
   983
		const TInt totalOverhead = metaData.iHeapSize - statistics.StatsAllocated().TypeSize();
hgs
parents:
diff changeset
   984
        list->AddItemL( KItem9c, totalOverhead );
hgs
parents:
diff changeset
   985
hgs
parents:
diff changeset
   986
        _LIT( KItem9d, "Overhead" );
hgs
parents:
diff changeset
   987
        list->AddItemPercentageL( KItem9d, metaData.iHeapSize, totalOverhead  );
hgs
parents:
diff changeset
   988
hgs
parents:
diff changeset
   989
        _LIT( KItem10, "Min. length" );
hgs
parents:
diff changeset
   990
        list->AddItemL( KItem10, metaData.iMinHeapSize );
hgs
parents:
diff changeset
   991
hgs
parents:
diff changeset
   992
        _LIT( KItem11, "Max. length" );
hgs
parents:
diff changeset
   993
        list->AddItemL( KItem11, metaData.iMaxHeapSize );
hgs
parents:
diff changeset
   994
hgs
parents:
diff changeset
   995
        _LIT( KItem12, "Debug Allocator Library" );
hgs
parents:
diff changeset
   996
        list->AddItemYesNoL( KItem12, metaData.IsDebugAllocator() );
hgs
parents:
diff changeset
   997
        }
hgs
parents:
diff changeset
   998
hgs
parents:
diff changeset
   999
    return list;
hgs
parents:
diff changeset
  1000
    }
hgs
parents:
diff changeset
  1001
hgs
parents:
diff changeset
  1002
52
hgs
parents: 51
diff changeset
  1003
EXPORT_C CMemSpyEngineOutputList* CMemSpyEngineHelperHeap::NewHeapSummaryExtendedLC( const TMemSpyHeapInfo& aInfo, 
hgs
parents: 51
diff changeset
  1004
                                                                                     const RArray<TMemSpyDriverCell>* aCells )
51
hgs
parents:
diff changeset
  1005
	{
hgs
parents:
diff changeset
  1006
    CMemSpyEngineOutputList* list = CMemSpyEngineOutputList::NewLC( iEngine.Sink() );
hgs
parents:
diff changeset
  1007
    //
hgs
parents:
diff changeset
  1008
    AppendMetaDataL( aInfo, *list );
hgs
parents:
diff changeset
  1009
    AppendStatisticsL( aInfo, *list );
hgs
parents:
diff changeset
  1010
    //
hgs
parents:
diff changeset
  1011
    if  ( aCells )
hgs
parents:
diff changeset
  1012
        {
hgs
parents:
diff changeset
  1013
        AppendCellsL( *aCells, *list );
hgs
parents:
diff changeset
  1014
        }
hgs
parents:
diff changeset
  1015
    //
hgs
parents:
diff changeset
  1016
    return list;
hgs
parents:
diff changeset
  1017
    }
hgs
parents:
diff changeset
  1018
hgs
parents:
diff changeset
  1019
hgs
parents:
diff changeset
  1020
//cigasto: not formatted - raw heap info 
hgs
parents:
diff changeset
  1021
EXPORT_C TMemSpyHeapData CMemSpyEngineHelperHeap::NewHeapRawInfo( const TMemSpyHeapInfo& aInfo )
hgs
parents:
diff changeset
  1022
	{
hgs
parents:
diff changeset
  1023
	_LIT(KUnknown, "Unknown");
hgs
parents:
diff changeset
  1024
	TMemSpyHeapData list;
hgs
parents:
diff changeset
  1025
	list.iType.Copy(KUnknown);
hgs
parents:
diff changeset
  1026
hgs
parents:
diff changeset
  1027
	// Heap type	
hgs
parents:
diff changeset
  1028
	if (aInfo.Type() != TMemSpyHeapInfo::ETypeUnknown)
hgs
parents:
diff changeset
  1029
		{
hgs
parents:
diff changeset
  1030
		const TMemSpyHeapInfoRHeap& rHeap = aInfo.AsRHeap();
hgs
parents:
diff changeset
  1031
		const TMemSpyHeapMetaDataRHeap& metaData = rHeap.MetaData();
hgs
parents:
diff changeset
  1032
		const TMemSpyHeapStatisticsRHeap& statistics = rHeap.Statistics();
hgs
parents:
diff changeset
  1033
hgs
parents:
diff changeset
  1034
		_LIT(KRHeap, "RHeap");
hgs
parents:
diff changeset
  1035
		_LIT(KRHybridHeap, "RHybridHeap");
hgs
parents:
diff changeset
  1036
		switch (aInfo.Type())
hgs
parents:
diff changeset
  1037
			{
hgs
parents:
diff changeset
  1038
			case TMemSpyHeapInfo::ETypeRHeap:
hgs
parents:
diff changeset
  1039
				list.iType.Copy(KRHeap);
hgs
parents:
diff changeset
  1040
				break;
hgs
parents:
diff changeset
  1041
			case TMemSpyHeapInfo::ETypeRHybridHeap:
hgs
parents:
diff changeset
  1042
				list.iType.Copy(KRHybridHeap);
hgs
parents:
diff changeset
  1043
				break;
hgs
parents:
diff changeset
  1044
			default:
hgs
parents:
diff changeset
  1045
				break;
hgs
parents:
diff changeset
  1046
			}
hgs
parents:
diff changeset
  1047
hgs
parents:
diff changeset
  1048
	    // Heap size is the total amount of memory committed to the heap, which includes the size of the embedded (in-place) RHeap/RHybridHeap.
hgs
parents:
diff changeset
  1049
	    list.iSize = metaData.iHeapSize;
hgs
parents:
diff changeset
  1050
	    list.iBaseAddress = (TUint)metaData.iAllocatorAddress; // TODO we can't do the base address any more, allocator address is the closest thing
hgs
parents:
diff changeset
  1051
	    list.iShared = metaData.IsSharedHeap();
hgs
parents:
diff changeset
  1052
	    list.iChunkSize = metaData.ChunkSize();
hgs
parents:
diff changeset
  1053
	    list.iAllocationsCount = statistics.StatsAllocated().TypeCount();
hgs
parents:
diff changeset
  1054
	    list.iFreeCount = statistics.StatsFree().TypeCount();
hgs
parents:
diff changeset
  1055
	    list.iBiggestAllocation = statistics.StatsAllocated().LargestCellSize();
hgs
parents:
diff changeset
  1056
	    list.iBiggestFree = statistics.StatsFree().LargestCellSize();
hgs
parents:
diff changeset
  1057
	    list.iTotalAllocations =  statistics.StatsAllocated().TypeSize();	        
hgs
parents:
diff changeset
  1058
	    list.iTotalFree =  statistics.StatsFree().TypeSize();
hgs
parents:
diff changeset
  1059
	    list.iSlackFreeSpace = statistics.StatsFree().SlackSpaceCellSize();
hgs
parents:
diff changeset
  1060
	    list.iFragmentation = statistics.StatsFree().TypeSize() - statistics.StatsFree().SlackSpaceCellSize(); //to calculate percentage value use iSize as 100% value
hgs
parents:
diff changeset
  1061
	    list.iHeaderSizeA = 0; //metaData.HeaderSizeAllocated();
hgs
parents:
diff changeset
  1062
	    list.iHeaderSizeF = 0; //metaData.HeaderSizeFree();
hgs
parents:
diff changeset
  1063
	    TInt allocOverhead = rHeap.Overhead(); //metaData.HeaderSizeAllocated() * statistics.StatsAllocated().TypeCount();
hgs
parents:
diff changeset
  1064
	    list.iAllocationOverhead = allocOverhead;
hgs
parents:
diff changeset
  1065
	    //TInt freeOverhead = metaData.HeaderSizeFree() * statistics.StatsFree().TypeCount();
hgs
parents:
diff changeset
  1066
	    list.iFreeOverhead = 0; // TODO there is no way of calculating this
hgs
parents:
diff changeset
  1067
	    list.iTotalOverhead = allocOverhead; // freeOverhead + allocOverhead
hgs
parents:
diff changeset
  1068
	    list.iOverhead = allocOverhead; //freeOverhead + allocOverhead; //to calculate percentage value use iSize as 100% value    
hgs
parents:
diff changeset
  1069
	    list.iMinLength = metaData.iMinHeapSize;
hgs
parents:
diff changeset
  1070
	    list.iMaxLength = metaData.iMaxHeapSize;
hgs
parents:
diff changeset
  1071
	    list.iDebugAllocatorLibrary = metaData.IsDebugAllocator();
hgs
parents:
diff changeset
  1072
		}
hgs
parents:
diff changeset
  1073
hgs
parents:
diff changeset
  1074
	return list;
hgs
parents:
diff changeset
  1075
	}
hgs
parents:
diff changeset
  1076
hgs
parents:
diff changeset
  1077
hgs
parents:
diff changeset
  1078
hgs
parents:
diff changeset
  1079
hgs
parents:
diff changeset
  1080
hgs
parents:
diff changeset
  1081
hgs
parents:
diff changeset
  1082
hgs
parents:
diff changeset
  1083
hgs
parents:
diff changeset
  1084
hgs
parents:
diff changeset
  1085
hgs
parents:
diff changeset
  1086
hgs
parents:
diff changeset
  1087
hgs
parents:
diff changeset
  1088
hgs
parents:
diff changeset
  1089
hgs
parents:
diff changeset
  1090
hgs
parents:
diff changeset
  1091
hgs
parents:
diff changeset
  1092
hgs
parents:
diff changeset
  1093
hgs
parents:
diff changeset
  1094
hgs
parents:
diff changeset
  1095
hgs
parents:
diff changeset
  1096
hgs
parents:
diff changeset
  1097
hgs
parents:
diff changeset
  1098
hgs
parents:
diff changeset
  1099
hgs
parents:
diff changeset
  1100
hgs
parents:
diff changeset
  1101
hgs
parents:
diff changeset
  1102
hgs
parents:
diff changeset
  1103
hgs
parents:
diff changeset
  1104
hgs
parents:
diff changeset
  1105
hgs
parents:
diff changeset
  1106
hgs
parents:
diff changeset
  1107
TUint CMemSpyEngineHelperHeap::DescriptorAsDWORD( const TDesC8& aItem)
hgs
parents:
diff changeset
  1108
    {
hgs
parents:
diff changeset
  1109
    __ASSERT_ALWAYS( aItem.Length() >= 4, User::Invariant() );
hgs
parents:
diff changeset
  1110
    const TUint ret =  aItem[0] +
hgs
parents:
diff changeset
  1111
                      (aItem[1] << 8) + 
hgs
parents:
diff changeset
  1112
                      (aItem[2] << 16) + 
hgs
parents:
diff changeset
  1113
                      (aItem[3] << 24);
hgs
parents:
diff changeset
  1114
    return ret;
hgs
parents:
diff changeset
  1115
    }
hgs
parents:
diff changeset
  1116
hgs
parents:
diff changeset
  1117
hgs
parents:
diff changeset
  1118
void CMemSpyEngineHelperHeap::AppendMetaDataL( const TMemSpyHeapInfo& aInfo, CMemSpyEngineOutputList& aList )
hgs
parents:
diff changeset
  1119
    {
hgs
parents:
diff changeset
  1120
    const TMemSpyHeapInfoRHeap& rHeap = aInfo.AsRHeap();
hgs
parents:
diff changeset
  1121
hgs
parents:
diff changeset
  1122
    // Make caption
hgs
parents:
diff changeset
  1123
    _LIT( KOverallCaption1, "Meta Data" );
hgs
parents:
diff changeset
  1124
    aList.AddItemL( KOverallCaption1 );
hgs
parents:
diff changeset
  1125
    aList.AddUnderlineForPreviousItemL( '=', 0 );
hgs
parents:
diff changeset
  1126
hgs
parents:
diff changeset
  1127
    // Type
hgs
parents:
diff changeset
  1128
    _LIT( KMetaData_Type,  "Type:" );
hgs
parents:
diff changeset
  1129
    if ( aInfo.Type() == TMemSpyHeapInfo::ETypeUnknown )
hgs
parents:
diff changeset
  1130
        {
hgs
parents:
diff changeset
  1131
        _LIT( KMetaData_Type_Unknown,  "Unknown" );
hgs
parents:
diff changeset
  1132
        aList.AddItemL( KMetaData_Type, KMetaData_Type_Unknown );
hgs
parents:
diff changeset
  1133
        }
hgs
parents:
diff changeset
  1134
    else
hgs
parents:
diff changeset
  1135
        {
hgs
parents:
diff changeset
  1136
        const TMemSpyHeapMetaDataRHeap& metaData = rHeap.MetaData();
hgs
parents:
diff changeset
  1137
    
hgs
parents:
diff changeset
  1138
        // Type
hgs
parents:
diff changeset
  1139
        _LIT( KMetaData_Type_RHeap,  "Symbian OS RHeap" );
hgs
parents:
diff changeset
  1140
        _LIT( KMetaData_Type_RHybridHeap,  "Symbian OS RHybridHeap" );
hgs
parents:
diff changeset
  1141
		if (aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap)
hgs
parents:
diff changeset
  1142
			{
hgs
parents:
diff changeset
  1143
	        aList.AddItemL( KMetaData_Type, KMetaData_Type_RHeap );
hgs
parents:
diff changeset
  1144
			}
hgs
parents:
diff changeset
  1145
		else
hgs
parents:
diff changeset
  1146
			{
hgs
parents:
diff changeset
  1147
			aList.AddItemL( KMetaData_Type, KMetaData_Type_RHybridHeap );
hgs
parents:
diff changeset
  1148
			}
hgs
parents:
diff changeset
  1149
hgs
parents:
diff changeset
  1150
        // VTable
hgs
parents:
diff changeset
  1151
        //_LIT( KMetaData_VTable,  "VTable:" );
hgs
parents:
diff changeset
  1152
        //aList.AddItemHexL( KMetaData_VTable, metaData.VTable() );
hgs
parents:
diff changeset
  1153
hgs
parents:
diff changeset
  1154
        // Object size
hgs
parents:
diff changeset
  1155
        //_LIT( KMetaData_ObjectSize,  "Object Size:" );
hgs
parents:
diff changeset
  1156
        //aList.AddItemL( KMetaData_ObjectSize, metaData.ClassSize() );
hgs
parents:
diff changeset
  1157
hgs
parents:
diff changeset
  1158
        // Chunk name
hgs
parents:
diff changeset
  1159
        _LIT( KMetaData_ChunkName,  "Chunk Name:" );
hgs
parents:
diff changeset
  1160
        TPtrC pChunkName( metaData.ChunkName() );
hgs
parents:
diff changeset
  1161
        aList.AddItemL( KMetaData_ChunkName, pChunkName );
hgs
parents:
diff changeset
  1162
hgs
parents:
diff changeset
  1163
        // Chunk size
hgs
parents:
diff changeset
  1164
        _LIT( KMetaData_ChunkSize,  "Chunk Size:" );
hgs
parents:
diff changeset
  1165
        aList.AddItemL( KMetaData_ChunkSize, metaData.ChunkSize() );
hgs
parents:
diff changeset
  1166
hgs
parents:
diff changeset
  1167
        // Chunk base address
hgs
parents:
diff changeset
  1168
        _LIT( KMetaData_ChunkBaseAddress,  "Chunk Base Address:" );
hgs
parents:
diff changeset
  1169
        aList.AddItemL( KMetaData_ChunkBaseAddress, metaData.ChunkBaseAddress() );
hgs
parents:
diff changeset
  1170
hgs
parents:
diff changeset
  1171
        // Debug allocator
hgs
parents:
diff changeset
  1172
        _LIT( KMetaData_DebugAllocator,  "Debug Allocator:" );
hgs
parents:
diff changeset
  1173
        aList.AddItemYesNoL( KMetaData_DebugAllocator, metaData.IsDebugAllocator() );
hgs
parents:
diff changeset
  1174
hgs
parents:
diff changeset
  1175
        // Shared Heap
hgs
parents:
diff changeset
  1176
        _LIT( KMetaData_Shared,  "Shared:" );
hgs
parents:
diff changeset
  1177
        aList.AddItemYesNoL( KMetaData_Shared, metaData.IsSharedHeap() );
hgs
parents:
diff changeset
  1178
hgs
parents:
diff changeset
  1179
        // Add ROM info
hgs
parents:
diff changeset
  1180
        iEngine.HelperROM().AddInfoL( aList );
hgs
parents:
diff changeset
  1181
        }
hgs
parents:
diff changeset
  1182
hgs
parents:
diff changeset
  1183
    aList.AddBlankItemL( 1 );
hgs
parents:
diff changeset
  1184
    }
hgs
parents:
diff changeset
  1185
hgs
parents:
diff changeset
  1186
void CMemSpyEngineHelperHeap::AppendStatisticsL( const TMemSpyHeapInfo& aInfo, CMemSpyEngineOutputList& aList )
hgs
parents:
diff changeset
  1187
    {
hgs
parents:
diff changeset
  1188
    if (aInfo.Type() != TMemSpyHeapInfo::ETypeUnknown)
hgs
parents:
diff changeset
  1189
        {
hgs
parents:
diff changeset
  1190
        const TMemSpyHeapInfoRHeap& rHeap = aInfo.AsRHeap();
hgs
parents:
diff changeset
  1191
        const TMemSpyHeapStatisticsRHeap& rHeapStats = rHeap.Statistics();
hgs
parents:
diff changeset
  1192
hgs
parents:
diff changeset
  1193
        // Shared captions
hgs
parents:
diff changeset
  1194
        _LIT( KStatsData_CellCount,  "Number of cells:" );
hgs
parents:
diff changeset
  1195
        _LIT( KStatsData_CellSize,  "Size of cells:" );
hgs
parents:
diff changeset
  1196
        _LIT( KStatsData_LargestCellAddress,  "Largest cell:" );
hgs
parents:
diff changeset
  1197
        _LIT( KStatsData_LargestCellSize,  "Largest cell size:" );
hgs
parents:
diff changeset
  1198
hgs
parents:
diff changeset
  1199
        // Free space
hgs
parents:
diff changeset
  1200
        _LIT( KOverallCaption1, "Free Cell Statistics" );
hgs
parents:
diff changeset
  1201
        aList.AddItemL( KOverallCaption1 );
hgs
parents:
diff changeset
  1202
        aList.AddUnderlineForPreviousItemL( '=', 0 );
hgs
parents:
diff changeset
  1203
hgs
parents:
diff changeset
  1204
        aList.AddItemL( KStatsData_CellCount, rHeapStats.StatsFree().TypeCount() );
hgs
parents:
diff changeset
  1205
        aList.AddItemL( KStatsData_CellSize, rHeapStats.StatsFree().TypeSize() );
hgs
parents:
diff changeset
  1206
        aList.AddItemL( KStatsData_LargestCellAddress, rHeapStats.StatsFree().LargestCellAddress() );
hgs
parents:
diff changeset
  1207
        aList.AddItemL( KStatsData_LargestCellSize, rHeapStats.StatsFree().LargestCellSize() );
hgs
parents:
diff changeset
  1208
		if (aInfo.Type() == TMemSpyHeapInfo::ETypeRHeap)
hgs
parents:
diff changeset
  1209
			{
hgs
parents:
diff changeset
  1210
			_LIT( KStatsData_Free_SlackCellAddress,  "Slack:" );
hgs
parents:
diff changeset
  1211
			aList.AddItemL( KStatsData_Free_SlackCellAddress, rHeapStats.StatsFree().SlackSpaceCellAddress() );
hgs
parents:
diff changeset
  1212
			_LIT( KStatsData_Free_SlackCellSize,  "Slack size:" );
hgs
parents:
diff changeset
  1213
			aList.AddItemL( KStatsData_Free_SlackCellSize, rHeapStats.StatsFree().SlackSpaceCellSize() );
hgs
parents:
diff changeset
  1214
			}
hgs
parents:
diff changeset
  1215
        _LIT( KStatsData_Free_Checksum,  "Checksum:" );
hgs
parents:
diff changeset
  1216
        aList.AddItemHexL( KStatsData_Free_Checksum, rHeapStats.StatsFree().Checksum() );
hgs
parents:
diff changeset
  1217
hgs
parents:
diff changeset
  1218
        aList.AddBlankItemL( 1 );
hgs
parents:
diff changeset
  1219
hgs
parents:
diff changeset
  1220
        // Allocated space
hgs
parents:
diff changeset
  1221
        _LIT( KOverallCaption2, "Allocated Cell Statistics" );
hgs
parents:
diff changeset
  1222
        aList.AddItemL( KOverallCaption2 );
hgs
parents:
diff changeset
  1223
        aList.AddUnderlineForPreviousItemL( '=', 0 );
hgs
parents:
diff changeset
  1224
hgs
parents:
diff changeset
  1225
        aList.AddItemL( KStatsData_CellCount, rHeapStats.StatsAllocated().TypeCount() );
hgs
parents:
diff changeset
  1226
        aList.AddItemL( KStatsData_CellSize, rHeapStats.StatsAllocated().TypeSize() );
hgs
parents:
diff changeset
  1227
        aList.AddItemL( KStatsData_LargestCellAddress, rHeapStats.StatsAllocated().LargestCellAddress() );
hgs
parents:
diff changeset
  1228
        aList.AddItemL( KStatsData_LargestCellSize, rHeapStats.StatsAllocated().LargestCellSize() );
hgs
parents:
diff changeset
  1229
hgs
parents:
diff changeset
  1230
        aList.AddBlankItemL( 1 );
hgs
parents:
diff changeset
  1231
         }
hgs
parents:
diff changeset
  1232
    }
hgs
parents:
diff changeset
  1233
hgs
parents:
diff changeset
  1234
hgs
parents:
diff changeset
  1235
void CMemSpyEngineHelperHeap::AppendCellsL(const RArray<TMemSpyDriverCell>& aCells, CMemSpyEngineOutputList& aList)
hgs
parents:
diff changeset
  1236
    {
hgs
parents:
diff changeset
  1237
    // For reasons that may or may not turn out to be sensible, we separate free and allocated cells in the output data
hgs
parents:
diff changeset
  1238
hgs
parents:
diff changeset
  1239
    _LIT( KOverallCaption1, "Free Cell List" );
hgs
parents:
diff changeset
  1240
    aList.AddItemL( KOverallCaption1 );
hgs
parents:
diff changeset
  1241
    aList.AddUnderlineForPreviousItemL( '=', 0 );
hgs
parents:
diff changeset
  1242
hgs
parents:
diff changeset
  1243
    TBuf<128> caption;
hgs
parents:
diff changeset
  1244
    _LIT( KCaptionFormat, "FC %04d" );
hgs
parents:
diff changeset
  1245
    _LIT( KValueFormat, "0x%08x %8d %d" );
hgs
parents:
diff changeset
  1246
hgs
parents:
diff changeset
  1247
	TBool foundAllocatedCells = EFalse;
hgs
parents:
diff changeset
  1248
    const TInt count = aCells.Count();
hgs
parents:
diff changeset
  1249
    for( TInt i=0; i<count; i++ )
hgs
parents:
diff changeset
  1250
        {
hgs
parents:
diff changeset
  1251
        const TMemSpyDriverCell& cell = aCells[ i ];
hgs
parents:
diff changeset
  1252
		if (cell.iType & EMemSpyDriverAllocatedCellMask)
hgs
parents:
diff changeset
  1253
			{
hgs
parents:
diff changeset
  1254
			foundAllocatedCells = ETrue;
hgs
parents:
diff changeset
  1255
			}
hgs
parents:
diff changeset
  1256
		else if (cell.iType & EMemSpyDriverFreeCellMask)
hgs
parents:
diff changeset
  1257
			{
hgs
parents:
diff changeset
  1258
	        caption.Format( KCaptionFormat, i + 1 );
hgs
parents:
diff changeset
  1259
		    aList.AddItemFormatL( caption, KValueFormat, cell.iAddress, cell.iLength, cell.iType );
hgs
parents:
diff changeset
  1260
			}
hgs
parents:
diff changeset
  1261
        }
hgs
parents:
diff changeset
  1262
hgs
parents:
diff changeset
  1263
	if (foundAllocatedCells)
hgs
parents:
diff changeset
  1264
		{
hgs
parents:
diff changeset
  1265
        aList.AddBlankItemL( 1 );
hgs
parents:
diff changeset
  1266
		_LIT( KOverallCaption1, "Allocated Cell List" );
hgs
parents:
diff changeset
  1267
		aList.AddItemL( KOverallCaption1 );
hgs
parents:
diff changeset
  1268
		aList.AddUnderlineForPreviousItemL( '=', 0 );
hgs
parents:
diff changeset
  1269
hgs
parents:
diff changeset
  1270
		TBuf<128> caption;
hgs
parents:
diff changeset
  1271
		_LIT( KCaptionFormat, "AC %04d" );
hgs
parents:
diff changeset
  1272
		_LIT( KValueFormat, "0x%08x %8d %d" );
hgs
parents:
diff changeset
  1273
hgs
parents:
diff changeset
  1274
		for (TInt i = 0; i < count; i++)
hgs
parents:
diff changeset
  1275
			{
hgs
parents:
diff changeset
  1276
			const TMemSpyDriverCell& cell = aCells[ i ];
hgs
parents:
diff changeset
  1277
			if (cell.iType & EMemSpyDriverAllocatedCellMask)
hgs
parents:
diff changeset
  1278
				{
hgs
parents:
diff changeset
  1279
				caption.Format( KCaptionFormat, i + 1 );
hgs
parents:
diff changeset
  1280
				aList.AddItemFormatL( caption, KValueFormat, cell.iAddress, cell.iLength, cell.iType );
hgs
parents:
diff changeset
  1281
				}
hgs
parents:
diff changeset
  1282
			}
hgs
parents:
diff changeset
  1283
		}
hgs
parents:
diff changeset
  1284
    }
hgs
parents:
diff changeset
  1285
52
hgs
parents: 51
diff changeset
  1286
void CMemSpyEngineHelperHeap::UpdateSharedHeapInfoL( const TProcessId& aProcess, 
hgs
parents: 51
diff changeset
  1287
                                                     const TThreadId& aThread, 
hgs
parents: 51
diff changeset
  1288
                                                     TMemSpyHeapInfo& aInfo )
51
hgs
parents:
diff changeset
  1289
    {
hgs
parents:
diff changeset
  1290
    RArray<TThreadId> threads;
hgs
parents:
diff changeset
  1291
    CleanupClosePushL( threads );
hgs
parents:
diff changeset
  1292
    iEngine.Driver().GetThreadsL( aProcess, threads );
hgs
parents:
diff changeset
  1293
    TMemSpyHeapInfo otherHeap;
hgs
parents:
diff changeset
  1294
    TThreadId otherThreadId;
hgs
parents:
diff changeset
  1295
    TInt r( KErrNone );
hgs
parents:
diff changeset
  1296
    for ( TInt i = 0; i < threads.Count(); i++ )
hgs
parents:
diff changeset
  1297
        {
hgs
parents:
diff changeset
  1298
        otherThreadId = threads[i];
hgs
parents:
diff changeset
  1299
        if ( aThread != otherThreadId ) // skip current thread
hgs
parents:
diff changeset
  1300
            {
hgs
parents:
diff changeset
  1301
            r = iEngine.Driver().GetHeapInfoUser( otherHeap, otherThreadId );
hgs
parents:
diff changeset
  1302
            if ( !r && otherHeap.AsRHeap().MetaData().ChunkHandle() == aInfo.AsRHeap().MetaData().ChunkHandle() )
hgs
parents:
diff changeset
  1303
                {
hgs
parents:
diff changeset
  1304
                TRACE( RDebug::Printf( "CMemSpyEngineHelperHeap::UpdateSharedHeapInfoL - shared heap detected chunkhandle: 0x%08x", aInfo.AsRHeap().MetaData().ChunkHandle() ) );
hgs
parents:
diff changeset
  1305
                aInfo.AsRHeap().MetaData().SetSharedHeap( ETrue );
hgs
parents:
diff changeset
  1306
                break;
hgs
parents:
diff changeset
  1307
                }
hgs
parents:
diff changeset
  1308
            }
hgs
parents:
diff changeset
  1309
        }
hgs
parents:
diff changeset
  1310
    CleanupStack::PopAndDestroy( &threads );
hgs
parents:
diff changeset
  1311
    }
hgs
parents:
diff changeset
  1312