8
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
1 |
/*
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
2 |
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
3 |
* All rights reserved.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
4 |
*
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
5 |
* Redistribution and use in source and binary forms, with or without
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
6 |
* modification, are permitted provided that the following conditions are met:
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
7 |
*
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
8 |
* - Redistributions of source code must retain the above copyright notice,
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
9 |
* this list of conditions and the following disclaimer.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
10 |
* - Redistributions in binary form must reproduce the above copyright notice,
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
11 |
* this list of conditions and the following disclaimer in the documentation
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
12 |
* and/or other materials provided with the distribution.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
13 |
* - Neither the name of Nokia Corporation nor the names of its contributors
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
14 |
* may be used to endorse or promote products derived from this software
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
15 |
* without specific prior written permission.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
16 |
*
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
17 |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
18 |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
19 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
20 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
21 |
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
22 |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
23 |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
24 |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
25 |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
26 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
27 |
* POSSIBILITY OF SUCH DAMAGE.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
28 |
*
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
29 |
* Initial Contributors:
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
30 |
* Nokia Corporation - initial contribution.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
31 |
*
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
32 |
* Contributors:
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
33 |
*
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
34 |
* Description:
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
35 |
*
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
36 |
*/
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
37 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
38 |
#define SUPPORT_OLD_MEMSPY_KERNEL_HEAP_DUMPS
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
39 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
40 |
using System;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
41 |
using System.Collections.Generic;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
42 |
using System.Text;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
43 |
using System.Text.RegularExpressions;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
44 |
using HeapLib.Reconstructor.Misc;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
45 |
using HeapLib.Reconstructor.DataSources.Analyser.Interpreter;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
46 |
using SymbianUtils;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
47 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
48 |
namespace HeapLib.Reconstructor.DataSources.Analyser.Extractor.Implementations
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
49 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
50 |
internal sealed class ExtractorText : Extractor
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
51 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
52 |
#region Constructors & destructor
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
53 |
public ExtractorText()
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
54 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
55 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
56 |
#endregion
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
57 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
58 |
#region API
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
59 |
public override bool CanExtractFrom( string aLine )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
60 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
61 |
// CASE 1: Original file format, logging via trace
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
62 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
63 |
// HeapData - EComServer::!ecomserver - HEAP INFO FOR THREAD 'EComServer::!ecomserver'
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
64 |
// HeapData - EComServer::!ecomserver - ==============================================
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
65 |
// HeapData - EComServer::!ecomserver - HeapInfo - heapBaseAddress: 0x00700074
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
66 |
// HeapData - EComServer::!ecomserver - HeapInfo - heapSize: 745352
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
67 |
// HeapData - EComServer::!ecomserver - HeapInfo - heapChunkSize: 745472
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
68 |
// ...
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
69 |
// HeapData - EComServer::!ecomserver - 00700084: 00 00 00 00 03 03 03 03 03 03 03 03 03 03 03 03 ................
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
70 |
// HeapData - EComServer::!ecomserver - 00700094: 03 03 03 03 03 03 03 03 28 00 00 00 ec 47 28 80 ........(....G(.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
71 |
// HeapData - EComServer::!ecomserver - 007000a4: d8 0c 70 00 58 0d 70 00 f8 0c 70 00 03 03 03 03 ..p.X.p...p.....
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
72 |
// HeapData - EComServer::!ecomserver - 007000b4: 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 ................
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
73 |
// HeapData - EComServer::!ecomserver - 007000c4: 48 00 00 00 e8 2b 30 80 00 2c 30 80 ec 02 70 00 H....+0..,0...p.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
74 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
75 |
// CASE 2: Original file format, logging to file
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
76 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
77 |
// HEAP INFO FOR THREAD 'ecomserver::!ecomserver'
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
78 |
// ==============================================
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
79 |
// HeapInfo - heapBaseAddress: 0x0f8c0074
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
80 |
// HeapInfo - heapSize: 262028
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
81 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
82 |
// CASE 3: Original file format, logging to file - kernel - the thread name is omitted!
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
83 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
84 |
// HeapInfo - heapBaseAddress: 0xc809b074
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
85 |
// HeapInfo - heapSize: 3374984
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
86 |
// HeapInfo - heapMinSize: 720892
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
87 |
// HeapInfo - heapMaxSize: 17408000
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
88 |
// HeapInfo - heapFreeCellAddress: 0xc809b04c
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
89 |
// HeapInfo - heapFreeCellLength: 0
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
90 |
// HeapInfo - heapMinCellSize: 40
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
91 |
// HeapInfo - heapUsingDebugAlloc: 0
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
92 |
// HeapInfo - chunkName: ekern.exe[100041af]0001::SvHeap
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
93 |
// HeapInfo - heapCellAllocCount: 15216
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
94 |
// HeapInfo - heapAllocSpace: 3171512
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
95 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
96 |
// CASE 4: New file format, still text, logging via trace
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
97 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
98 |
// HeapData - ApsExe::AppArcServerThread - HEAP INFO FOR THREAD 'APSEXE::APPARCSERVERTHREAD'
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
99 |
// HeapData - ApsExe::AppArcServerThread - =================================================
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
100 |
// HeapData - ApsExe::AppArcServerThread -
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
101 |
// HeapData - ApsExe::AppArcServerThread - Meta Data
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
102 |
// HeapData - ApsExe::AppArcServerThread - =========
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
103 |
// HeapData - ApsExe::AppArcServerThread - Type: Symbian OS RHeap
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
104 |
// HeapData - ApsExe::AppArcServerThread - Chunk Name: ApsExe.exe[10003a3f]0001::AppArcServerThread::$HEAP
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
105 |
// HeapData - ApsExe::AppArcServerThread - Chunk Size: 319488
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
106 |
// HeapData - ApsExe::AppArcServerThread - Chunk Base Address: 0x00600000
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
107 |
// HeapData - ApsExe::AppArcServerThread - Debug Allocator: 0
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
108 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
109 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
110 |
// First step is to identify the prefix. We do this by looking for the common line which remains
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
111 |
// unchanged in all text file formats, and that is the "HEAP INFO FOR THREAD" item.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
112 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
113 |
// If the data included tracing prefixes (e.g. Musti), these will already have been removed.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
114 |
bool ret = false;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
115 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
116 |
string line = aLine;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
117 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
118 |
#if SUPPORT_OLD_MEMSPY_KERNEL_HEAP_DUMPS
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
119 |
if ( line.Contains( "HeapInfo - heapBaseAddress: 0xc" ) )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
120 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
121 |
// This is a work around for a problem with an old version of MemSpy in which
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
122 |
// the kernel thread name was not included in the heap data listing. This
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
123 |
// results in Heap Analyser discarding the thread entirely.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
124 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
125 |
// Spoof the line
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
126 |
int startPos = line.IndexOf( "HeapInfo - heapBaseAddress: 0xc" );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
127 |
line = line.Substring( 0, startPos ) + "HEAP INFO FOR THREAD \'ekern.exe[100041af]0001::Supervisor\' ";
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
128 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
129 |
#endif
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
130 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
131 |
Match heapInfoForThreadMatch = KHeapInfoInitialRegEx.Match( line );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
132 |
if ( heapInfoForThreadMatch.Success )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
133 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
134 |
// Work out if there is a prefix prior to the HEAP INFO element...
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
135 |
int pos = heapInfoForThreadMatch.Index;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
136 |
if ( pos == 0 )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
137 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
138 |
// There's no prefix
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
139 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
140 |
else
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
141 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
142 |
// There is some kind of standard prefix
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
143 |
iPrefix = line.Substring( 0, pos );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
144 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
145 |
// Check if there is the "HeapData -" prefix also. If there is we may need to strip off a musti timestamp:
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
146 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
147 |
// E.g.:
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
148 |
// 10:54:29.672 HeapData - !MsvServer::!MsvServer - 00600a74: 00 00 00 00 20 00 00 00 04 00 00 00 57 4c 29 80 ............WL).
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
149 |
// 10:54:29.672 HeapData - !MsvServer::!MsvServer - 00600a84: 00 00 00 00 d8 11 00 00 03 03 03 03 03 03 03 03 ................
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
150 |
// 10:54:29.672 HeapData - !MsvServer::!MsvServer - 00600a94: 28 00 00 00 64 f9 52 80 00 24 60 00 50 00 00 10 (...d.R..$`.P...
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
151 |
// 10:54:29.672 HeapData - !MsvServer::!MsvServer - 00600aa4: 69 3c 00 10 d6 72 20 10 00 00 00 00 01 00 00 00 i<...r..........
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
152 |
// 10:54:29.672 HeapData - !MsvServer::!MsvServer - 00600ab4: 38 21 60 00 00 00 00 00 40 00 00 00 c4 4c 2c 80 8!`.....@....L,.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
153 |
// 10:54:29.672 HeapData - !MsvServer::!MsvServer - 00600ac4: 38 00 00 00 20 00 00 00 40 00 00 00 28 43 60 00 8.......@...(C`.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
154 |
// 10:54:29.672 HeapData - !MsvServer::!MsvServer - 00600ad4: 28 00 00 00 a4 1f 60 00 14 00 bf 00 c1 00 cb 00 (.....`.........
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
155 |
// 10:54:29.672 HeapData - !MsvServer::!MsvServer - 00600ae4: 10 4e 40 00 ad 2f 37 80 a8 1f 60 00 03 03 03 03 .N@../7...`.....
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
156 |
// 10:54:29.672 HeapData - !MsvServer::!MsvServer - 00600af4: 03 03 03 03 03 03 03 03 98 04 00 00 94 f6 52 80 ..............R.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
157 |
if ( iPrefix.Contains( KHeapDataPrefix ) )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
158 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
159 |
int pos2 = iPrefix.IndexOf( KHeapDataPrefix );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
160 |
iPrefix = iPrefix.Substring( pos2 );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
161 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
162 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
163 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
164 |
// Either way, we need the thread name as we use this
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
165 |
// as the identifier for the data source, i.e. the hash
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
166 |
iThreadName = heapInfoForThreadMatch.Groups[ "ThreadName" ].Value;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
167 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
168 |
// Save data after the prefix
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
169 |
base.PrimaryLine = line.Substring( heapInfoForThreadMatch.Index );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
170 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
171 |
ret = true;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
172 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
173 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
174 |
return ret;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
175 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
176 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
177 |
public override bool ExtractFrom( string aLine, bool aForceExtractionOfThreadIdentifier )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
178 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
179 |
// First pass identification stage
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
180 |
string line = aLine;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
181 |
bool handled = ( iPrefix.Length == 0 );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
182 |
if ( !handled )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
183 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
184 |
// Check for prefix match
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
185 |
handled = aLine.Contains( iPrefix );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
186 |
if ( handled )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
187 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
188 |
// Check that it's not the start of a new data set
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
189 |
if ( !aForceExtractionOfThreadIdentifier && aLine.Contains( KHeapDataDataSetStartMarker ) ) // "HEAP INFO FOR THREAD"
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
190 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
191 |
handled = false;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
192 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
193 |
else
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
194 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
195 |
int pos = aLine.IndexOf( iPrefix );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
196 |
line = aLine.Substring( pos + iPrefix.Length );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
197 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
198 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
199 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
200 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
201 |
// Data processing stage
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
202 |
if ( handled )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
203 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
204 |
ExtractedData data = PrepareExtractedData( line, aLine );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
205 |
base.Interpreter.Interpret( data );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
206 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
207 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
208 |
// Done
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
209 |
return handled;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
210 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
211 |
#endregion
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
212 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
213 |
#region Properties
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
214 |
public override string Hash
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
215 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
216 |
get { return iThreadName; }
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
217 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
218 |
#endregion
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
219 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
220 |
#region Internal methods
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
221 |
private ExtractedData PrepareExtractedData( string aLine, string aOriginalLine )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
222 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
223 |
ExtractedData ret = null;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
224 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
225 |
// We need the heap base address before we are able to start
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
226 |
// extracting binary data.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
227 |
DataSource ds = Interpreter.DataSource;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
228 |
Elements.MetaData metaData = ds.MetaData;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
229 |
Elements.Groups.GpHeap heapInfo = metaData.Heap;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
230 |
uint baseAddress = heapInfo.HeapBaseAddress;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
231 |
if ( baseAddress != 0 )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
232 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
233 |
// We can now work out the next expected address
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
234 |
uint nextExpectedAddress = baseAddress + (uint) metaData.HeapData.Count;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
235 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
236 |
// Build our regex string that will match the binary heap data.
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
237 |
string prefix = string.Format( "{0:x8}: ", nextExpectedAddress );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
238 |
int pos = aLine.IndexOf( prefix );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
239 |
if ( pos >= 0 )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
240 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
241 |
Match m = KHeapDataRegEx.Match( aLine );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
242 |
if ( m.Success )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
243 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
244 |
List<byte> bytes = new List<byte>();
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
245 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
246 |
CaptureCollection data = m.Groups[ "Data" ].Captures;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
247 |
foreach ( Capture dataItem in data )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
248 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
249 |
string hexValue = dataItem.Value.Trim();
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
250 |
uint byteVal = System.Convert.ToUInt32( hexValue, KBaseHex );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
251 |
bytes.Add( (byte) byteVal );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
252 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
253 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
254 |
ret = ExtractedData.NewBinaryData( bytes.ToArray(), aOriginalLine );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
255 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
256 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
257 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
258 |
if ( ret == null )
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
259 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
260 |
ret = ExtractedData.NewText( aLine, aOriginalLine );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
261 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
262 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
263 |
else
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
264 |
{
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
265 |
ret = ExtractedData.NewText( aLine, aOriginalLine );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
266 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
267 |
//
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
268 |
return ret;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
269 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
270 |
#endregion
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
271 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
272 |
#region Internal constants
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
273 |
private const int KBaseHex = 16;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
274 |
private const string KHeapDataPrefix = "HeapData -";
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
275 |
private const string KHeapDataDataSetStartMarker = "HEAP INFO FOR THREAD";
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
276 |
#endregion
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
277 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
278 |
#region Internal regular expressions
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
279 |
private static readonly Regex KHeapInfoInitialRegEx = new Regex(
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
280 |
@"HEAP INFO FOR THREAD \'(?<ThreadName>.+)\'",
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
281 |
RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
282 |
private static readonly Regex KHeapDataRegEx = new Regex(
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
283 |
@"\x3A" +
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
284 |
@"\s{1}" +
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
285 |
@"(?<Data>[a-fA-F0-9]{2}\s{1}){1,16}" +
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
286 |
@"(?<Padding>\s{1}){0,44}",
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
287 |
RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase );
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
288 |
#endregion
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
289 |
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
290 |
#region Data members
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
291 |
private string iPrefix = string.Empty;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
292 |
private string iThreadName = string.Empty;
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
293 |
#endregion
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
294 |
}
|
Matti Laitinen <matti.t.laitinen@nokia.com>
parents:
diff
changeset
|
295 |
}
|