memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanHeapWalk.cpp
branchRCL_3
changeset 59 8ad140f3dd41
parent 49 7fdc9a71d314
equal deleted inserted replaced
49:7fdc9a71d314 59:8ad140f3dd41
   122 
   122 
   123 
   123 
   124 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapInit( TMemSpyDriverInternalWalkHeapParamsInit* aParams )
   124 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapInit( TMemSpyDriverInternalWalkHeapParamsInit* aParams )
   125     {
   125     {
   126 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit() - START"));
   126 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit() - START"));
   127     __ASSERT_ALWAYS( !iHeapWalkInitialised && iWalkHeap.Helper() == NULL, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkPending ) );
   127     __ASSERT_ALWAYS( !iHeapWalkInitialised && iWalkHeap.ChunkIsInitialised() == EFalse, MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkPending ) );
   128 
   128 
   129     TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &iHeapWalkInitialParameters, sizeof(TMemSpyDriverInternalWalkHeapParamsInit) );
   129     TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &iHeapWalkInitialParameters, sizeof(TMemSpyDriverInternalWalkHeapParamsInit) );
   130     if  ( r == KErrNone )
   130     if  ( r == KErrNone )
   131         {
   131         {
   132 	    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - thread id: %d, vtable: 0x%08x, debugAllocator: %d", iHeapWalkInitialParameters.iTid, iHeapWalkInitialParameters.iRHeapVTable, iHeapWalkInitialParameters.iDebugAllocator));
   132 	    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - thread id: %d, vtable: 0x%08x, debugAllocator: %d", iHeapWalkInitialParameters.iTid, iHeapWalkInitialParameters.iRHeapVTable, iHeapWalkInitialParameters.iDebugAllocator));
   139             if  ( SuspensionManager().IsSuspended( *thread ) )
   139             if  ( SuspensionManager().IsSuspended( *thread ) )
   140                 {
   140                 {
   141                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - thread: %O", thread));
   141                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - thread: %O", thread));
   142 
   142 
   143                 // Open client's heap
   143                 // Open client's heap
   144                 r = iWalkHeap.OpenUserHeap(*thread, iHeapWalkInitialParameters.iDebugAllocator);
   144                 DChunk* userHeapChunk = NULL;
   145 
   145                 r = OpenUserHeap( *thread, iHeapWalkInitialParameters.iRHeapVTable, iWalkHeap, userHeapChunk );
   146                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - opening client heap returned: %d", r) );
   146                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - opening client heap returned: %d", r) );
   147 
   147 
   148                 if  ( r == KErrNone )
   148                 if  ( r == KErrNone )
   149                     {
   149                     {
   150                     // Indicates that we've initiated a walk - so we can tell whether to close
   150                     // Indicates that we've initiated a walk - so we can tell whether to close
   152                     iHeapWalkInitialised = ETrue;
   152                     iHeapWalkInitialised = ETrue;
   153                     iWalkHeapCellIndex = 0;
   153                     iWalkHeapCellIndex = 0;
   154 
   154 
   155                     // Walk the client's heap
   155                     // Walk the client's heap
   156                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - calling heap walker constructor..."));
   156                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - calling heap walker constructor..."));
   157                     RMemSpyDriverHeapWalker heapWalker(iWalkHeap);
   157                     RMemSpyDriverHeapWalker heapWalker( iWalkHeap, iHeapWalkInitialParameters.iDebugAllocator );
   158                     
   158                     
   159                     TMemSpyDriverLogChanHeapWalkObserver observer( *this );
   159                     TMemSpyDriverLogChanHeapWalkObserver observer( *this );
   160                     heapWalker.SetObserver( &observer );
   160                     heapWalker.SetObserver( &observer );
   161 
   161 
   162                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - starting traversal..."));
   162                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - starting traversal..."));
   167                 // If the initialise process didn't complete successfully, then we must be sure
   167                 // If the initialise process didn't complete successfully, then we must be sure
   168                 // to release the associated heap chunk
   168                 // to release the associated heap chunk
   169                 if  ( r < KErrNone )
   169                 if  ( r < KErrNone )
   170                     {
   170                     {
   171                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - error scenario - releasing kernel heap chunk copy" ));
   171                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - error scenario - releasing kernel heap chunk copy" ));
   172                     iWalkHeap.Close();
   172                     iWalkHeap.DisassociateWithKernelChunk();
   173                     }
   173                     }
   174                 }
   174                 }
   175             else
   175             else
   176                 {
   176                 {
   177                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - parent process not suspended => KErrAccessDenied"));
   177                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapInit - parent process not suspended => KErrAccessDenied"));
   197 
   197 
   198 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapNextCell( TUint aTid, TMemSpyDriverInternalWalkHeapParamsCell* aParams )
   198 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapNextCell( TUint aTid, TMemSpyDriverInternalWalkHeapParamsCell* aParams )
   199     {
   199     {
   200     const TInt walkedHeapCellCount = iWalkHeapCells.Count();
   200     const TInt walkedHeapCellCount = iWalkHeapCells.Count();
   201 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapNextCell() - START - current cell count: %d", walkedHeapCellCount));
   201 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapNextCell() - START - current cell count: %d", walkedHeapCellCount));
   202     __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.Helper(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
   202     __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.ChunkIsInitialised(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
   203 
   203 
   204     // Open the original thread
   204     // Open the original thread
   205 	TInt r = OpenTempObject( aTid, EThread );
   205 	TInt r = OpenTempObject( aTid, EThread );
   206 	if  ( r == KErrNone )
   206 	if  ( r == KErrNone )
   207 		{
   207 		{
   255     if  ( iHeapWalkInitialised )
   255     if  ( iHeapWalkInitialised )
   256         {
   256         {
   257         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapClose - heap walk was still open..."));
   257         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapClose - heap walk was still open..."));
   258       	NKern::ThreadEnterCS();
   258       	NKern::ThreadEnterCS();
   259 
   259 
   260 		iWalkHeap.Close();
   260         if  ( iWalkHeap.ChunkIsInitialised() )
       
   261             {
       
   262             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapClose - removing chunk (%O) from process", &iWalkHeap.Chunk() ) );
       
   263             iWalkHeap.DisassociateWithKernelChunk();
       
   264             iWalkHeap.Reset();
       
   265             }
   261 
   266 
   262         // Discard handled cells
   267         // Discard handled cells
   263         iWalkHeapCells.Reset();
   268         iWalkHeapCells.Reset();
   264 
   269 
   265         iHeapWalkInitialised = EFalse;
   270         iHeapWalkInitialised = EFalse;
   272     }
   277     }
   273 
   278 
   274 
   279 
   275 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData(TMemSpyDriverInternalWalkHeapCellDataReadParams* aParams)
   280 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData(TMemSpyDriverInternalWalkHeapCellDataReadParams* aParams)
   276     {
   281     {
   277     __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.Helper(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
   282     __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.ChunkIsInitialised(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
   278     //
   283     //
   279 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData() - START - thread id: %d, vtable: 0x%08x", iHeapWalkInitialParameters.iTid, iHeapWalkInitialParameters.iRHeapVTable));
   284     const TBool debugEUser = iHeapWalkInitialParameters.iDebugAllocator;
       
   285 	TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData() - START - thread id: %d, vtable: 0x%08x, debugAllocator: %d", iHeapWalkInitialParameters.iTid, iHeapWalkInitialParameters.iRHeapVTable, debugEUser));
   280     //
   286     //
   281 	TMemSpyDriverInternalWalkHeapCellDataReadParams params;
   287 	TMemSpyDriverInternalWalkHeapCellDataReadParams params;
   282     TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverInternalWalkHeapCellDataReadParams) );
   288     TInt r = Kern::ThreadRawRead( &ClientThread(), aParams, &params, sizeof(TMemSpyDriverInternalWalkHeapCellDataReadParams) );
   283     if  ( r != KErrNone )
   289     if  ( r != KErrNone )
   284         {
   290         {
   298         // Check the threads in the process are suspended
   304         // Check the threads in the process are suspended
   299         if  ( SuspensionManager().IsSuspended( *thread ) )
   305         if  ( SuspensionManager().IsSuspended( *thread ) )
   300             {
   306             {
   301             // Check we can find the cell in the cell list...
   307             // Check we can find the cell in the cell list...
   302             const TMemSpyDriverInternalWalkHeapParamsCell* cell = CellInfoForSpecificAddress( params.iCellAddress );
   308             const TMemSpyDriverInternalWalkHeapParamsCell* cell = CellInfoForSpecificAddress( params.iCellAddress );
       
   309             if  ( cell == NULL )
       
   310                 {
       
   311                 // Maybe the client tried the base address of the cell data.
       
   312                 // try to take the header into account and retry.
       
   313                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - didnt find matching cell for address: 0x%08x... trying address minus allocatedCellHeaderSize", params.iCellAddress ));
       
   314 
       
   315                 const TUint32 cellHeaderSize = (TUint32) RMemSpyDriverRHeapBase::AllocatedCellHeaderSize( debugEUser );
       
   316         
       
   317                 TUint32 addr = (TUint32) params.iCellAddress;
       
   318                 addr -= cellHeaderSize;
       
   319                 params.iCellAddress = (TAny*) addr;
       
   320                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - new address: 0x%08x", params.iCellAddress ));
       
   321         
       
   322                 // Last try
       
   323                 cell = CellInfoForSpecificAddress( params.iCellAddress );
       
   324                 }
   303 
   325 
   304             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - cell: 0x%08x for address: 0x%08x", cell, params.iCellAddress ));
   326             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - cell: 0x%08x for address: 0x%08x", cell, params.iCellAddress ));
   305 
   327 
   306             if  ( cell )
   328             if  ( cell )
   307                 {
   329                 {
   308                 const TInt cellLen = cell->iLength;
   330                 const TBool isValidCell = iWalkHeap.CheckCell( cell->iCellAddress, cell->iLength );
   309                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - cellLen: %d", cellLen ));
   331                 TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - isValidCell: %d", isValidCell ));
   310 
   332         
   311                 if  ( params.iReadLen <= cellLen )
   333                 if  ( isValidCell )
   312                     {
   334                     {
   313 
   335                     // Check the length request is valid
   314                     // Get user side descriptor length info
   336                     const TInt cellLen = cell->iLength;
   315          	        TInt destLen = 0;
   337                     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - cellLen: %d", cellLen ));
   316         	        TInt destMax = 0;
   338 
   317                     TUint8* destPtr = NULL;
   339                     if  ( params.iReadLen <= cellLen )
   318 
       
   319                     r = Kern::ThreadGetDesInfo( &ClientThread(), params.iDes, destLen, destMax, destPtr, ETrue );
       
   320         	        TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - user side descriptor: 0x%08x (0x%08x), len: %8d, maxLen: %8d, r: %d", params.iDes, destPtr, destLen, destMax, r ));
       
   321 
       
   322                     // Work out the start offset for the data...
       
   323                     if  ( r == KErrNone && destMax >= params.iReadLen )
       
   324                         {
   340                         {
   325                         const TAny* srcPos = ((TUint8*) cell->iCellAddress);
   341                         const TInt cellHeaderSize = RMemSpyDriverRHeapBase::CellHeaderSize( *cell, debugEUser );
   326         	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - srcPos: 0x%08x", srcPos ));
   342         	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - cellHeaderSize: %8d", cellHeaderSize ));
   327 
   343 
   328                         // Read some data 
   344                         // Get user side descriptor length info
   329                         r = Kern::ThreadRawRead( thread, srcPos, destPtr, params.iReadLen );
   345          	            TInt destLen = 0;
   330     	                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - read from thread returned: %d", r));
   346         	            TInt destMax = 0;
   331 
   347                         TUint8* destPtr = NULL;
   332                         if  ( r == KErrNone )
   348 
       
   349                         r = Kern::ThreadGetDesInfo( &ClientThread(), params.iDes, destLen, destMax, destPtr, ETrue );
       
   350         	            TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - user side descriptor: 0x%08x (0x%08x), len: %8d, maxLen: %8d, r: %d", params.iDes, destPtr, destLen, destMax, r ));
       
   351 
       
   352                         // Work out the start offset for the data...
       
   353                         if  ( r == KErrNone && destMax >= params.iReadLen )
   333                             {
   354                             {
   334                             // Client will update descriptor length in this situation.
   355                             const TAny* srcPos = ((TUint8*) cell->iCellAddress) + cellHeaderSize;
   335                             r = params.iReadLen;
   356         	                TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - srcPos: 0x%08x", srcPos ));
       
   357 
       
   358                             // Read some data 
       
   359                             r = Kern::ThreadRawRead( thread, srcPos, destPtr, params.iReadLen );
       
   360     	                    TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - read from thread returned: %d", r));
       
   361 
       
   362                             if  ( r == KErrNone )
       
   363                                 {
       
   364                                 // Client will update descriptor length in this situation.
       
   365                                 r = params.iReadLen;
       
   366                                 }
       
   367                             else if ( r == KErrBadDescriptor )
       
   368                                 {
       
   369                                 MemSpyDriverUtils::PanicThread( ClientThread(), EPanicBadDescriptor );
       
   370                                 }
       
   371                             }
       
   372                         else
       
   373                             {
       
   374                             if  ( r != KErrBadDescriptor )
       
   375                                 {
       
   376                                 r = KErrArgument;                
       
   377             	                Kern::Printf( "DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - user-descriptor isnt big enough for requested data" );
       
   378                                 }
       
   379                             else
       
   380                                 {
       
   381             	                Kern::Printf( "DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - bad or non-writable user-side descriptor" );
       
   382                                 }
   336                             }
   383                             }
   337                         }
   384                         }
   338                     else
   385                     else
   339                         {
   386                         {
   340                         if  ( r != KErrBadDescriptor )
   387                         r = KErrArgument;
   341                             {
   388         	            Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - read length is bigger than cell length");
   342                             r = KErrArgument;                
       
   343             	            Kern::Printf( "DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - user-descriptor isnt big enough for requested data" );
       
   344                             }
       
   345                         else
       
   346                             {
       
   347             	            Kern::Printf( "DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - bad or non-writable user-side descriptor" );
       
   348                             }
       
   349                         }
   389                         }
   350                     }
   390                     }
   351                 else
   391                 else
   352                     {
   392                     {
   353                     r = KErrArgument;
   393                     r = KErrArgument;
   354         	        Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - error - read length is bigger than cell length");
   394                     Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - invalid cell address: 0x%08x", cell);
   355                     }
   395                     }
   356                 }
   396                 }
   357             else
   397             else
   358                 {
   398                 {
   359                 r = KErrArgument;
   399                 r = KErrArgument;
   371     else
   411     else
   372         {
   412         {
   373     	Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - thread not found");
   413     	Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData - thread not found");
   374 		}
   414 		}
   375     //
   415     //
   376     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData() - END result=%d", r));
   416     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapReadCellData() - END"));
   377     return r;
   417     return r;
   378     }
   418     }
   379 
   419 
   380 
   420 
   381 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo( TAny* aCellAddress, TMemSpyDriverInternalWalkHeapParamsCell* aParams )
   421 TInt DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo( TAny* aCellAddress, TMemSpyDriverInternalWalkHeapParamsCell* aParams )
   382     {
   422     {
   383     __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.Helper(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
   423     __ASSERT_ALWAYS( iHeapWalkInitialised && iWalkHeap.ChunkIsInitialised(), MemSpyDriverUtils::PanicThread( ClientThread(), EPanicHeapWalkNotInitialised ) );
   384     //
   424     //
   385     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo() - START - thread id: %d, vtable: 0x%08x", iHeapWalkInitialParameters.iTid, iHeapWalkInitialParameters.iRHeapVTable));
   425     const TBool debugEUser = iHeapWalkInitialParameters.iDebugAllocator;
       
   426     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo() - START - thread id: %d, vtable: 0x%08x, debugAllocator: %d", iHeapWalkInitialParameters.iTid, iHeapWalkInitialParameters.iRHeapVTable, debugEUser));
   386     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - cell: 0x%08x", aCellAddress));
   427     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - cell: 0x%08x", aCellAddress));
   387 
   428 
   388     // Open the original thread
   429     // Open the original thread
   389 	TInt r = OpenTempObject( iHeapWalkInitialParameters.iTid, EThread );
   430 	TInt r = OpenTempObject( iHeapWalkInitialParameters.iTid, EThread );
   390 	if (r != KErrNone)
   431 	if (r != KErrNone)
   407     // Check we can find the cell in the cell list...
   448     // Check we can find the cell in the cell list...
   408     const TMemSpyDriverInternalWalkHeapParamsCell* cell = CellInfoForSpecificAddress( aCellAddress );
   449     const TMemSpyDriverInternalWalkHeapParamsCell* cell = CellInfoForSpecificAddress( aCellAddress );
   409     if  ( cell == NULL )
   450     if  ( cell == NULL )
   410         {
   451         {
   411         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - no exact match for address: 0x%08x...", aCellAddress));
   452         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - no exact match for address: 0x%08x...", aCellAddress));
       
   453 
       
   454         // Maybe the client tried the base address of the cell data.
       
   455         // try to take the header into account and retry.
       
   456         const TUint32 cellHeaderSize = (TUint32) RMemSpyDriverRHeapBase::AllocatedCellHeaderSize( debugEUser );
       
   457         TUint32 addr = (TUint32) aCellAddress;
       
   458         addr -= cellHeaderSize;
       
   459         
       
   460         TAny* cellByRawStartingAddress = (TAny*) addr;
       
   461         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - trying to search by start of cell address: 0x%08x (cellHeaderSize: %d)", cellByRawStartingAddress, cellHeaderSize));
       
   462         cell = CellInfoForSpecificAddress( cellByRawStartingAddress );
   412         
   463         
   413         // If the cell still wasn't found, then let's look for any heap cell that contains
   464         // If the cell still wasn't found, then let's look for any heap cell that contains
   414         // the client-specified address (i.e. find the heap cell that contains the specified
   465         // the client-specified address (i.e. find the heap cell that contains the specified
   415         // address).
   466         // address).
   416         if  ( cell == NULL )
   467         if  ( cell == NULL )
   420             }
   471             }
   421         }
   472         }
   422 
   473 
   423     if  ( cell )
   474     if  ( cell )
   424         {
   475         {
   425         // Have enough info to write back to client now
   476         const TBool isValidCell = iWalkHeap.CheckCell( cell->iCellAddress, cell->iLength );
   426         TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - returning... cellType: %1d, addr: 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", cell->iCellType, cell->iCellAddress, cell->iLength, cell->iNestingLevel, cell->iAllocNumber ));
   477         if  ( isValidCell )
   427         r = Kern::ThreadRawWrite( &ClientThread(), aParams, cell, sizeof(TMemSpyDriverInternalWalkHeapParamsCell) );
   478             {
       
   479             // Have enough info to write back to client now
       
   480             TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - returning... cellType: %1d, addr: 0x%08x, len: %8d, nestingLev: %8d, allocNum: %8d", cell->iCellType, cell->iCellAddress, cell->iLength, cell->iNestingLevel, cell->iAllocNumber ));
       
   481             r = Kern::ThreadRawWrite( &ClientThread(), aParams, cell, sizeof(TMemSpyDriverInternalWalkHeapParamsCell) );
       
   482             }
       
   483         else
       
   484             {
       
   485             r = KErrArgument;
       
   486             Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - invalid cell address: 0x%08x", cell);
       
   487             }
   428         }
   488         }
   429     else
   489     else
   430         {
   490         {
   431         r = KErrArgument;
   491         r = KErrArgument;
   432         Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - no cell at user supplied address!");
   492         Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo - no cell at user supplied address!");
   433         }
   493         }
   434     
   494     
   435     CloseTempObject();
   495     CloseTempObject();
   436     //
   496     //
   437     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo() - END result=%d", r));
   497     TRACE( Kern::Printf("DMemSpyDriverLogChanHeapWalk::WalkHeapGetCellInfo() - END"));
   438     return r;
   498     return r;
   439     }
   499     }
   440 
   500 
   441 
   501 
   442 
   502 
   514 
   574 
   515 
   575 
   516 
   576 
   517 
   577 
   518 
   578 
   519 TBool DMemSpyDriverLogChanHeapWalk::WalkerHandleHeapCell(TMemSpyDriverCellType aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber )
   579 TBool DMemSpyDriverLogChanHeapWalk::WalkerHandleHeapCell( TInt aCellType, TAny* aCellAddress, TInt aLength, TInt aNestingLevel, TInt aAllocNumber )
   520     {
   580     {
   521     TInt error = KErrNone;
   581     TInt error = KErrNone;
   522     //
   582     //
   523     if  ( iHeapWalkInitialised )
   583     if  ( iHeapWalkInitialised )
   524         {
   584         {