perfsrv/analyzetool/commandlineengine/src/CATDatParser.cpp
author hgs
Mon, 06 Sep 2010 15:00:47 +0300
changeset 51 98307c651589
permissions -rw-r--r--
201035
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:  Class responsible to parse data files
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "../inc/CATDatParser.h"
hgs
parents:
diff changeset
    20
#include "../inc/CATProject.h"
hgs
parents:
diff changeset
    21
#include "../inc/CATModule2.h"
hgs
parents:
diff changeset
    22
#include "../inc/CATMemoryAddress.h"
hgs
parents:
diff changeset
    23
#include "../inc/catromsymbol.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    26
// CATDatParser::CATDatParser
hgs
parents:
diff changeset
    27
// Constructor only for testing!
hgs
parents:
diff changeset
    28
// (No module vector defined so no locating codelines / call stacks)
hgs
parents:
diff changeset
    29
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    30
CATDatParser::CATDatParser()
hgs
parents:
diff changeset
    31
{
hgs
parents:
diff changeset
    32
	LOG_FUNC_ENTRY("CATDatParser::CATDatParser");
hgs
parents:
diff changeset
    33
	Construct();
hgs
parents:
diff changeset
    34
}
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    37
// CATDatParser::CATDatParser
hgs
parents:
diff changeset
    38
// Constructor
hgs
parents:
diff changeset
    39
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    40
CATDatParser::CATDatParser(vector<CATModule2*>* pModules )
hgs
parents:
diff changeset
    41
{
hgs
parents:
diff changeset
    42
	LOG_FUNC_ENTRY("CATDatParser::CATDatParser");
hgs
parents:
diff changeset
    43
	Construct();
hgs
parents:
diff changeset
    44
	m_pModules = pModules;
hgs
parents:
diff changeset
    45
}
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
// CATDatParser::Construct
hgs
parents:
diff changeset
    49
// "Real" constructor
hgs
parents:
diff changeset
    50
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
void CATDatParser::Construct()
hgs
parents:
diff changeset
    52
{
hgs
parents:
diff changeset
    53
	LOG_FUNC_ENTRY("CATDatParser::Construct");
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
	m_iDataVersion = 1; // Default version of data.
hgs
parents:
diff changeset
    56
	m_bDllLoadFound = false;
hgs
parents:
diff changeset
    57
	m_bProcessStartFound = false;
hgs
parents:
diff changeset
    58
	m_bSubtestOnGoing = false;
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
	m_DataSaver.InitXML();
hgs
parents:
diff changeset
    61
	
hgs
parents:
diff changeset
    62
	m_eBuildType = -2;
hgs
parents:
diff changeset
    63
	m_eProcess_state = not_started;
hgs
parents:
diff changeset
    64
	m_eProjectBuildType = -1;
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
	m_iCurrentProcessId = 0;
hgs
parents:
diff changeset
    67
	m_iLeakNumber = 0;
hgs
parents:
diff changeset
    68
	m_iLogLevel = 3;
hgs
parents:
diff changeset
    69
	m_iOffSet = 0;
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
	m_iPinPointedLeaks = 0;
hgs
parents:
diff changeset
    72
	m_iPinPointedSubTestLeaks = 0;
hgs
parents:
diff changeset
    73
	m_iSubtestStartHandleCount = 0;
hgs
parents:
diff changeset
    74
	m_iSuccesfullRuns = 0;
hgs
parents:
diff changeset
    75
	m_iTotalNumberOfLeaks = 0;
hgs
parents:
diff changeset
    76
	m_iTotalRuns = 0;
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
	m_pRomSymbol = 0;
hgs
parents:
diff changeset
    79
	m_pModules = 0;
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
	m_sCurrentProcessName = "";
hgs
parents:
diff changeset
    82
	m_sInputFile = "";
hgs
parents:
diff changeset
    83
	m_sInputFileTemp = "";
hgs
parents:
diff changeset
    84
	m_sOutputFile = "";
hgs
parents:
diff changeset
    85
	m_sProjectPlatform = "";
hgs
parents:
diff changeset
    86
	m_vRomSymbolFiles.clear();
hgs
parents:
diff changeset
    87
	m_vDllLoadModList.clear();
hgs
parents:
diff changeset
    88
	m_vDllLoadModListSubTest.clear();
hgs
parents:
diff changeset
    89
	m_vHandleLeaks.clear();
hgs
parents:
diff changeset
    90
	m_vMemoryAddress.clear();
hgs
parents:
diff changeset
    91
}
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    94
// CATDatParser::~CATDatParser
hgs
parents:
diff changeset
    95
// Destructor
hgs
parents:
diff changeset
    96
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    97
CATDatParser::~CATDatParser()
hgs
parents:
diff changeset
    98
{
hgs
parents:
diff changeset
    99
	LOG_FUNC_ENTRY("CATDatParser::~CATDatParser");
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
	if ( m_In.is_open() )
hgs
parents:
diff changeset
   102
		m_In.close();
hgs
parents:
diff changeset
   103
	// Delete temporary input file if any
hgs
parents:
diff changeset
   104
	if ( !m_sInputFileTemp.empty() )
hgs
parents:
diff changeset
   105
	{
hgs
parents:
diff changeset
   106
		if ( FileExists( m_sInputFileTemp.c_str() ) )
hgs
parents:
diff changeset
   107
			FileDelete( m_sInputFileTemp, false );
hgs
parents:
diff changeset
   108
	}
hgs
parents:
diff changeset
   109
	// Clean memory addresses if any
hgs
parents:
diff changeset
   110
	CleanMemoryAddresses();
hgs
parents:
diff changeset
   111
	// Delete rom symbol.
hgs
parents:
diff changeset
   112
	if ( m_pRomSymbol )
hgs
parents:
diff changeset
   113
	{
hgs
parents:
diff changeset
   114
        delete m_pRomSymbol;
hgs
parents:
diff changeset
   115
		m_pRomSymbol = NULL;
hgs
parents:
diff changeset
   116
	}
hgs
parents:
diff changeset
   117
}
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   120
// CATDatParser::Analyze
hgs
parents:
diff changeset
   121
// Analyze given data file
hgs
parents:
diff changeset
   122
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   123
int CATDatParser::Analyze()
hgs
parents:
diff changeset
   124
{
hgs
parents:
diff changeset
   125
	LOG_FUNC_ENTRY("CATDatParser::Analyze");
hgs
parents:
diff changeset
   126
	// Return if input file not set
hgs
parents:
diff changeset
   127
	if ( m_sInputFile.empty() )
hgs
parents:
diff changeset
   128
		return AT_RETURN_CODE::INVALID_DATA_FILE;
hgs
parents:
diff changeset
   129
	// If open close first
hgs
parents:
diff changeset
   130
	if ( m_In.is_open() )
hgs
parents:
diff changeset
   131
		m_In.close();
hgs
parents:
diff changeset
   132
	// Open file
hgs
parents:
diff changeset
   133
	m_In.open( m_sInputFile.c_str() );
hgs
parents:
diff changeset
   134
	if ( ! m_In.good() )
hgs
parents:
diff changeset
   135
		return AT_RETURN_CODE::INVALID_DATA_FILE;
hgs
parents:
diff changeset
   136
	try {
hgs
parents:
diff changeset
   137
		// If rom symbol file specified.
hgs
parents:
diff changeset
   138
		if ( ! m_vRomSymbolFiles.empty() )
hgs
parents:
diff changeset
   139
		{
hgs
parents:
diff changeset
   140
			// Create new rom symbol file "parser".
hgs
parents:
diff changeset
   141
			m_pRomSymbol = new CATRomSymbol();
hgs
parents:
diff changeset
   142
			m_pRomSymbol->m_bShowProgressMessages = true;
hgs
parents:
diff changeset
   143
			// Set symbol files.
hgs
parents:
diff changeset
   144
			if ( ! m_pRomSymbol->SetSymbols( m_vRomSymbolFiles ) )
hgs
parents:
diff changeset
   145
			{
hgs
parents:
diff changeset
   146
				cout << AT_MSG << "Rom/Rofs symbols error: " << m_pRomSymbol->GetError() << endl;
hgs
parents:
diff changeset
   147
				// If file open fails we delete it and will not use it.
hgs
parents:
diff changeset
   148
				delete m_pRomSymbol;
hgs
parents:
diff changeset
   149
				m_pRomSymbol = NULL;
hgs
parents:
diff changeset
   150
				cout << AT_MSG << "Analyze aborted." << endl;
hgs
parents:
diff changeset
   151
				return AT_RETURN_CODE::SYMBOL_FILE_ERROR;
hgs
parents:
diff changeset
   152
			}
hgs
parents:
diff changeset
   153
		}
hgs
parents:
diff changeset
   154
		// Return code
hgs
parents:
diff changeset
   155
		int iRet = 0;
hgs
parents:
diff changeset
   156
		// Clear variables
hgs
parents:
diff changeset
   157
		ClearParsingVariables();
hgs
parents:
diff changeset
   158
		// If output defined disable printing
hgs
parents:
diff changeset
   159
		if ( ! m_sOutputFile.empty() )
hgs
parents:
diff changeset
   160
			m_DataSaver.SetPrintFlag( false );
hgs
parents:
diff changeset
   161
		// Header
hgs
parents:
diff changeset
   162
		Header();
hgs
parents:
diff changeset
   163
		// Parsing
hgs
parents:
diff changeset
   164
		iRet = Parse();
hgs
parents:
diff changeset
   165
		// Footer
hgs
parents:
diff changeset
   166
		if ( iRet == AT_RETURN_CODE::OK )
hgs
parents:
diff changeset
   167
			Footer();
hgs
parents:
diff changeset
   168
		// If output defined save xml
hgs
parents:
diff changeset
   169
		if ( ! m_sOutputFile.empty() )
hgs
parents:
diff changeset
   170
			m_DataSaver.SaveLinesToFile( m_sOutputFile.c_str(), XML_DATA );
hgs
parents:
diff changeset
   171
		// Return
hgs
parents:
diff changeset
   172
		return iRet;
hgs
parents:
diff changeset
   173
	} catch ( int i )
hgs
parents:
diff changeset
   174
	{
hgs
parents:
diff changeset
   175
		cout << AT_MSG << "Error, Analyze failed. : " << i << endl;
hgs
parents:
diff changeset
   176
		return AT_RETURN_CODE::UNHANDLED_EXCEPTION;
hgs
parents:
diff changeset
   177
	}
hgs
parents:
diff changeset
   178
}
hgs
parents:
diff changeset
   179
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   180
// CATDatParser::Header
hgs
parents:
diff changeset
   181
// Print header of report
hgs
parents:
diff changeset
   182
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   183
void CATDatParser::Header()
hgs
parents:
diff changeset
   184
{
hgs
parents:
diff changeset
   185
	LOG_FUNC_ENTRY("CATDatParser::Header");
hgs
parents:
diff changeset
   186
	// Analyze report header
hgs
parents:
diff changeset
   187
	m_DataSaver.AddString( "Atool.exe v." );
hgs
parents:
diff changeset
   188
	m_DataSaver.AddString( ATOOL_VERSION );
hgs
parents:
diff changeset
   189
	m_DataSaver.AddString( "\n" );
hgs
parents:
diff changeset
   190
	m_DataSaver.AddString( "Analyzing memory leaks..." );
hgs
parents:
diff changeset
   191
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   192
}
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   195
// CATDatParser::Footer
hgs
parents:
diff changeset
   196
// Print footer of report
hgs
parents:
diff changeset
   197
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   198
void CATDatParser::Footer()
hgs
parents:
diff changeset
   199
{
hgs
parents:
diff changeset
   200
	LOG_FUNC_ENTRY("CATDatParser::Footer");
hgs
parents:
diff changeset
   201
	m_DataSaver.AddString( "\nTotal Runs: " );
hgs
parents:
diff changeset
   202
	m_DataSaver.AddInteger( m_iTotalRuns );
hgs
parents:
diff changeset
   203
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
	int iFailedRuns = m_iTotalRuns - m_iSuccesfullRuns;
hgs
parents:
diff changeset
   206
	m_DataSaver.AddString( "Failed Runs: " );
hgs
parents:
diff changeset
   207
	m_DataSaver.AddInteger( iFailedRuns );
hgs
parents:
diff changeset
   208
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
	char cTemp[128];
hgs
parents:
diff changeset
   211
	string sResult( itoa( m_iTotalRuns, cTemp, 10 ) );
hgs
parents:
diff changeset
   212
	sResult.append( ";" );
hgs
parents:
diff changeset
   213
	sResult.append( itoa( iFailedRuns, cTemp, 10 ) );
hgs
parents:
diff changeset
   214
	sResult.append( ";" );
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
	m_DataSaver.SaveXML( sResult, RESULT );
hgs
parents:
diff changeset
   217
}
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   220
// CATDatParser::ClearParsingVariables
hgs
parents:
diff changeset
   221
// Clear/Reset all member variables related to parsing data file
hgs
parents:
diff changeset
   222
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   223
void CATDatParser::ClearParsingVariables()
hgs
parents:
diff changeset
   224
{
hgs
parents:
diff changeset
   225
	LOG_FUNC_ENTRY("CATDatParser::ClearParsingVariables");
hgs
parents:
diff changeset
   226
	// Clear variables related to analyze
hgs
parents:
diff changeset
   227
	m_eProcess_state = not_started;
hgs
parents:
diff changeset
   228
	m_bProcessStartFound = false;
hgs
parents:
diff changeset
   229
	m_bDllLoadFound = false;
hgs
parents:
diff changeset
   230
	m_iTotalNumberOfLeaks = 0;
hgs
parents:
diff changeset
   231
	m_iPinPointedLeaks = 0;
hgs
parents:
diff changeset
   232
	m_iLeakNumber = 0;
hgs
parents:
diff changeset
   233
	m_iTotalRuns = 0;
hgs
parents:
diff changeset
   234
	m_iSuccesfullRuns = 0;
hgs
parents:
diff changeset
   235
	m_bSubtestOnGoing = false;
hgs
parents:
diff changeset
   236
	m_iSubtestStartHandleCount = 0;
hgs
parents:
diff changeset
   237
	CleanMemoryAddresses();
hgs
parents:
diff changeset
   238
}
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   241
// CATDatParser::Parse
hgs
parents:
diff changeset
   242
// Parses data file. Note! header and footer of the report are done in 
hgs
parents:
diff changeset
   243
// separate functions.
hgs
parents:
diff changeset
   244
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   245
int CATDatParser::Parse()
hgs
parents:
diff changeset
   246
{
hgs
parents:
diff changeset
   247
	LOG_FUNC_ENTRY("CATDatParser::Parse");
hgs
parents:
diff changeset
   248
	// Read all lines
hgs
parents:
diff changeset
   249
	char cLine[MAX_LINE_LENGTH];
hgs
parents:
diff changeset
   250
	do
hgs
parents:
diff changeset
   251
	{
hgs
parents:
diff changeset
   252
		string sLine;
hgs
parents:
diff changeset
   253
		try {
hgs
parents:
diff changeset
   254
			m_In.getline( cLine, MAX_LINE_LENGTH );
hgs
parents:
diff changeset
   255
			sLine = cLine ;
hgs
parents:
diff changeset
   256
		} catch(...)
hgs
parents:
diff changeset
   257
		{
hgs
parents:
diff changeset
   258
			LOG_STRING( AT_MSG << "Unexpected error, reading data file." );
hgs
parents:
diff changeset
   259
			continue;
hgs
parents:
diff changeset
   260
		}
hgs
parents:
diff changeset
   261
		if( sLine.find( LABEL_DATA_FILE_VERSION ) != string::npos )
hgs
parents:
diff changeset
   262
		{
hgs
parents:
diff changeset
   263
			// Check data file version
hgs
parents:
diff changeset
   264
			if(  sLine.find( AT_DATA_FILE_VERSION ) == string::npos )
hgs
parents:
diff changeset
   265
			{
hgs
parents:
diff changeset
   266
				return AT_RETURN_CODE::WRONG_DATA_FILE_VERSION;
hgs
parents:
diff changeset
   267
			}
hgs
parents:
diff changeset
   268
		}
hgs
parents:
diff changeset
   269
		else if( sLine.find( LABEL_PROCESS_START ) != string::npos )
hgs
parents:
diff changeset
   270
		{
hgs
parents:
diff changeset
   271
			if ( ! ParseProcessStart( sLine ) )
hgs
parents:
diff changeset
   272
				return AT_RETURN_CODE::ANALYZE_ERROR;
hgs
parents:
diff changeset
   273
		}
hgs
parents:
diff changeset
   274
		else if( sLine.find( LABEL_DLL_LOAD ) != string::npos )
hgs
parents:
diff changeset
   275
		{
hgs
parents:
diff changeset
   276
			if ( ! ParseDllLoad( sLine ) )
hgs
parents:
diff changeset
   277
				return AT_RETURN_CODE::ANALYZE_ERROR;
hgs
parents:
diff changeset
   278
		}
hgs
parents:
diff changeset
   279
		else if( sLine.find( LABEL_DLL_UNLOAD ) != string::npos )
hgs
parents:
diff changeset
   280
		{
hgs
parents:
diff changeset
   281
			if ( ! ParseDllUnload( sLine ) )
hgs
parents:
diff changeset
   282
				return AT_RETURN_CODE::ANALYZE_ERROR;
hgs
parents:
diff changeset
   283
		}
hgs
parents:
diff changeset
   284
		else if( sLine.find( LABEL_MEM_LEAK ) != string::npos)
hgs
parents:
diff changeset
   285
		{
hgs
parents:
diff changeset
   286
			if ( ! ParseMemLeak( sLine ) )
hgs
parents:
diff changeset
   287
				return AT_RETURN_CODE::ANALYZE_ERROR;
hgs
parents:
diff changeset
   288
		}
hgs
parents:
diff changeset
   289
		else if( sLine.find( LABEL_PROCESS_END ) != string::npos )
hgs
parents:
diff changeset
   290
		{
hgs
parents:
diff changeset
   291
			if ( ! ParseProcessEnd( sLine ) )
hgs
parents:
diff changeset
   292
				return AT_RETURN_CODE::ANALYZE_ERROR;
hgs
parents:
diff changeset
   293
		}
hgs
parents:
diff changeset
   294
		else if( sLine.find( LABEL_ERROR_OCCURED ) != string::npos )
hgs
parents:
diff changeset
   295
		{
hgs
parents:
diff changeset
   296
			if ( ! ParseErrorOccured( sLine ) )
hgs
parents:
diff changeset
   297
				return AT_RETURN_CODE::ANALYZE_ERROR;
hgs
parents:
diff changeset
   298
		}
hgs
parents:
diff changeset
   299
		else if( sLine.find( LABEL_HANDLE_LEAK ) != string::npos )
hgs
parents:
diff changeset
   300
		{
hgs
parents:
diff changeset
   301
			if ( ! ParseHandleLeak( sLine ) )
hgs
parents:
diff changeset
   302
				return AT_RETURN_CODE::ANALYZE_ERROR;
hgs
parents:
diff changeset
   303
		}
hgs
parents:
diff changeset
   304
		else if( sLine.find( LABEL_TEST_START ) != string::npos )
hgs
parents:
diff changeset
   305
		{
hgs
parents:
diff changeset
   306
			if ( ! ParseTestStart( sLine ) )
hgs
parents:
diff changeset
   307
				return AT_RETURN_CODE::ANALYZE_ERROR;
hgs
parents:
diff changeset
   308
		}
hgs
parents:
diff changeset
   309
		else if( sLine.find( LABEL_TEST_END ) != string::npos )
hgs
parents:
diff changeset
   310
		{
hgs
parents:
diff changeset
   311
			if ( ! ParseTestEnd( sLine ) )
hgs
parents:
diff changeset
   312
				return AT_RETURN_CODE::ANALYZE_ERROR;
hgs
parents:
diff changeset
   313
		}
hgs
parents:
diff changeset
   314
		else if( sLine.find( LABEL_LOGGING_CANCELLED ) != string::npos )
hgs
parents:
diff changeset
   315
		{
hgs
parents:
diff changeset
   316
			if ( ! ParseLoggingCancelled( sLine ) )
hgs
parents:
diff changeset
   317
				return AT_RETURN_CODE::ANALYZE_ERROR;
hgs
parents:
diff changeset
   318
		}
hgs
parents:
diff changeset
   319
	}
hgs
parents:
diff changeset
   320
	while( m_In.good() );
hgs
parents:
diff changeset
   321
	// Message of failed run if process start was last line in data.
hgs
parents:
diff changeset
   322
	if ( m_eProcess_state == ongoing )
hgs
parents:
diff changeset
   323
	{
hgs
parents:
diff changeset
   324
		m_DataSaver.AddString( "Test run failed.\n" );
hgs
parents:
diff changeset
   325
		m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   326
	}
hgs
parents:
diff changeset
   327
	return AT_RETURN_CODE::OK;
hgs
parents:
diff changeset
   328
}
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   331
// CATDatParser::ParseProcessStart
hgs
parents:
diff changeset
   332
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   333
bool CATDatParser::ParseProcessStart( string& sLine)
hgs
parents:
diff changeset
   334
{
hgs
parents:
diff changeset
   335
	LOG_FUNC_ENTRY("CATDatParser::ParseProcessStart");
hgs
parents:
diff changeset
   336
	if ( m_eProcess_state == ongoing )
hgs
parents:
diff changeset
   337
	{
hgs
parents:
diff changeset
   338
		m_DataSaver.AddString( "Test run failed.\n" );
hgs
parents:
diff changeset
   339
		m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   340
	}
hgs
parents:
diff changeset
   341
	m_eProcess_state = ongoing;
hgs
parents:
diff changeset
   342
	m_bProcessStartFound = true;
hgs
parents:
diff changeset
   343
hgs
parents:
diff changeset
   344
	// Clear handle leaks
hgs
parents:
diff changeset
   345
	m_vHandleLeaks.clear();
hgs
parents:
diff changeset
   346
	// Increment runs
hgs
parents:
diff changeset
   347
	m_iTotalRuns++;
hgs
parents:
diff changeset
   348
	// Clean leak count
hgs
parents:
diff changeset
   349
	m_iTotalNumberOfLeaks = 0;
hgs
parents:
diff changeset
   350
	// Clean pin pointed leaks count.
hgs
parents:
diff changeset
   351
	m_iPinPointedLeaks = 0;
hgs
parents:
diff changeset
   352
	// Clean leak number
hgs
parents:
diff changeset
   353
	m_iLeakNumber = 0;
hgs
parents:
diff changeset
   354
hgs
parents:
diff changeset
   355
	// Clean loaded mods
hgs
parents:
diff changeset
   356
	m_vDllLoadModList.clear();
hgs
parents:
diff changeset
   357
	m_vDllLoadModListSubTest.clear();
hgs
parents:
diff changeset
   358
hgs
parents:
diff changeset
   359
	// Skip text PROCESS_START
hgs
parents:
diff changeset
   360
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   361
	// Get process name
hgs
parents:
diff changeset
   362
	m_sCurrentProcessName = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   363
	// Get Pid
hgs
parents:
diff changeset
   364
	string sPid = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   365
	m_iCurrentProcessId = _httoi( sPid.c_str() );
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
	// Header for process start
hgs
parents:
diff changeset
   368
	m_DataSaver.AddString( "\n--------------------------------\n" );
hgs
parents:
diff changeset
   369
	m_DataSaver.AddString( "Test Run start (" );
hgs
parents:
diff changeset
   370
	m_DataSaver.AddString( m_sCurrentProcessName.c_str() );
hgs
parents:
diff changeset
   371
	m_DataSaver.AddString( "): " );
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
	// Get start time
hgs
parents:
diff changeset
   374
	string sTime = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   375
	sTime = ConvertTimeToLocalTime( sTime );
hgs
parents:
diff changeset
   376
	m_DataSaver.AddString( sTime.c_str() );
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
	// Create data for xml
hgs
parents:
diff changeset
   379
	string sData( sTime );
hgs
parents:
diff changeset
   380
	sData.append( ";" );
hgs
parents:
diff changeset
   381
	
hgs
parents:
diff changeset
   382
	// Build mode UDEB/UREL.
hgs
parents:
diff changeset
   383
	string sBuildType = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
	m_DataSaver.AddString( " Build target: " );
hgs
parents:
diff changeset
   386
	if( sBuildType.compare( "0" ) == 0 )
hgs
parents:
diff changeset
   387
	{
hgs
parents:
diff changeset
   388
		m_eBuildType = CATProject::UREL;
hgs
parents:
diff changeset
   389
	}
hgs
parents:
diff changeset
   390
	else if( sBuildType.compare( "1" ) == 0 )
hgs
parents:
diff changeset
   391
	{
hgs
parents:
diff changeset
   392
		m_eBuildType = CATProject::UDEB;
hgs
parents:
diff changeset
   393
	}
hgs
parents:
diff changeset
   394
	m_DataSaver.AddString( CATProject::GetBuildTypeString( m_eBuildType ).c_str() );
hgs
parents:
diff changeset
   395
hgs
parents:
diff changeset
   396
	// Version.
hgs
parents:
diff changeset
   397
	string sVersion = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   398
	unsigned int iVer = 0;
hgs
parents:
diff changeset
   399
	if ( hexToDec( sVersion, iVer ) && iVer != 0 )
hgs
parents:
diff changeset
   400
		m_iDataVersion = iVer;
hgs
parents:
diff changeset
   401
hgs
parents:
diff changeset
   402
	// End line in data.
hgs
parents:
diff changeset
   403
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   404
	
hgs
parents:
diff changeset
   405
	// xml
hgs
parents:
diff changeset
   406
	sData.append( CATProject::GetBuildTypeString( m_eBuildType ) );
hgs
parents:
diff changeset
   407
	sData.append( ";" );
hgs
parents:
diff changeset
   408
	sData.append( m_sCurrentProcessName );
hgs
parents:
diff changeset
   409
	m_DataSaver.SaveXML( sData, RUN );
hgs
parents:
diff changeset
   410
hgs
parents:
diff changeset
   411
	// If projects platform defined check that it is same in data. (future feature).
hgs
parents:
diff changeset
   412
	if ( ! m_sProjectPlatform.empty() )
hgs
parents:
diff changeset
   413
	{
hgs
parents:
diff changeset
   414
		// If platform info is added to data file do check here.
hgs
parents:
diff changeset
   415
	}
hgs
parents:
diff changeset
   416
	// If projects build type defined check that it is same in data.
hgs
parents:
diff changeset
   417
	if ( m_eProjectBuildType != -1 )
hgs
parents:
diff changeset
   418
	{
hgs
parents:
diff changeset
   419
		if ( m_eBuildType != m_eProjectBuildType )
hgs
parents:
diff changeset
   420
		{
hgs
parents:
diff changeset
   421
			string sError(AT_MSG);
hgs
parents:
diff changeset
   422
			sError.append( "Error, analyzed data has build type of " );
hgs
parents:
diff changeset
   423
			sError.append( CATProject::GetBuildTypeString( m_eBuildType ) );
hgs
parents:
diff changeset
   424
			sError.append( " and project has build type " );
hgs
parents:
diff changeset
   425
			sError.append( CATProject::GetBuildTypeString( m_eProjectBuildType ) );
hgs
parents:
diff changeset
   426
			sError.append( ". Pinpointed code lines are not valid." );
hgs
parents:
diff changeset
   427
			m_DataSaver.AddString( sError.c_str(), false );
hgs
parents:
diff changeset
   428
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   429
		}
hgs
parents:
diff changeset
   430
	}
hgs
parents:
diff changeset
   431
	return true;
hgs
parents:
diff changeset
   432
}
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   435
// CATDatParser::ParseProcessEnd
hgs
parents:
diff changeset
   436
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   437
bool CATDatParser::ParseProcessEnd( string& sLine )
hgs
parents:
diff changeset
   438
{
hgs
parents:
diff changeset
   439
	LOG_FUNC_ENTRY("CATDatParser::ParseProcessEnd");
hgs
parents:
diff changeset
   440
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   441
hgs
parents:
diff changeset
   442
	// Get process id
hgs
parents:
diff changeset
   443
	string sProcessID = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   444
	unsigned long iProcessID = _httoi( sProcessID.c_str() );
hgs
parents:
diff changeset
   445
hgs
parents:
diff changeset
   446
	// Get time
hgs
parents:
diff changeset
   447
	string sTime = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   448
hgs
parents:
diff changeset
   449
	// Convert leak time
hgs
parents:
diff changeset
   450
	sTime = ConvertTimeToLocalTime( sTime );
hgs
parents:
diff changeset
   451
hgs
parents:
diff changeset
   452
	// Process started?
hgs
parents:
diff changeset
   453
	if( iProcessID == m_iCurrentProcessId )
hgs
parents:
diff changeset
   454
	{
hgs
parents:
diff changeset
   455
		m_iSuccesfullRuns++;
hgs
parents:
diff changeset
   456
		m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   457
		m_DataSaver.AddString( "Test Run end (" );
hgs
parents:
diff changeset
   458
		m_DataSaver.AddString( m_sCurrentProcessName.c_str() );
hgs
parents:
diff changeset
   459
		m_DataSaver.AddString( "): " );
hgs
parents:
diff changeset
   460
		m_DataSaver.AddString( sTime.c_str() );
hgs
parents:
diff changeset
   461
		m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   462
		m_DataSaver.AddString( "Build target: " );
hgs
parents:
diff changeset
   463
		m_DataSaver.AddString( CATProject::GetBuildTypeString( m_eBuildType ).c_str() );
hgs
parents:
diff changeset
   464
		m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   465
hgs
parents:
diff changeset
   466
		m_eProcess_state = stopped;
hgs
parents:
diff changeset
   467
		// Number of leaks
hgs
parents:
diff changeset
   468
		if ( m_iLogLevel == 1 || m_iLogLevel == 2 )
hgs
parents:
diff changeset
   469
		{
hgs
parents:
diff changeset
   470
			if ( m_iPinPointedLeaks > 0 )
hgs
parents:
diff changeset
   471
			{
hgs
parents:
diff changeset
   472
				m_DataSaver.AddInteger( m_iPinPointedLeaks );
hgs
parents:
diff changeset
   473
				m_DataSaver.AddString( " number of pinpointed memory leak(s)." );
hgs
parents:
diff changeset
   474
				m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   475
			}
hgs
parents:
diff changeset
   476
			m_DataSaver.AddInteger( m_iLeakNumber );
hgs
parents:
diff changeset
   477
			m_DataSaver.AddString( " total number of memory leak(s)." );
hgs
parents:
diff changeset
   478
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   479
		}
hgs
parents:
diff changeset
   480
		else
hgs
parents:
diff changeset
   481
		{
hgs
parents:
diff changeset
   482
			m_DataSaver.AddInteger( m_iTotalNumberOfLeaks );
hgs
parents:
diff changeset
   483
			m_DataSaver.AddString( " memory leak(s) found." );
hgs
parents:
diff changeset
   484
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   485
		}
hgs
parents:
diff changeset
   486
		
hgs
parents:
diff changeset
   487
		// xml
hgs
parents:
diff changeset
   488
		char cTemp[128];
hgs
parents:
diff changeset
   489
		m_DataSaver.SaveXML( itoa( m_iTotalNumberOfLeaks, cTemp, 10 ) , MEM_LEAKS );
hgs
parents:
diff changeset
   490
hgs
parents:
diff changeset
   491
		// Print all modules which have leaks
hgs
parents:
diff changeset
   492
		for( size_t i = 0 ; i < m_vDllLoadModList.size() ; i++ )
hgs
parents:
diff changeset
   493
		{
hgs
parents:
diff changeset
   494
			if( m_vDllLoadModList.at(i).iLeaks > 0 )
hgs
parents:
diff changeset
   495
			{
hgs
parents:
diff changeset
   496
				m_DataSaver.AddInteger( m_vDllLoadModList.at(i).iLeaks );
hgs
parents:
diff changeset
   497
				m_DataSaver.AddString( " memory leak(s) in module: " );
hgs
parents:
diff changeset
   498
				m_DataSaver.AddString( m_vDllLoadModList.at(i).sModuleName.c_str() );
hgs
parents:
diff changeset
   499
				m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   500
hgs
parents:
diff changeset
   501
				// xml
hgs
parents:
diff changeset
   502
				string sModuleNameAndLeaks( m_vDllLoadModList[i].sModuleName );
hgs
parents:
diff changeset
   503
				sModuleNameAndLeaks.append(";");
hgs
parents:
diff changeset
   504
				sModuleNameAndLeaks.append( itoa( m_vDllLoadModList[i].iLeaks, cTemp, 10 ) );
hgs
parents:
diff changeset
   505
				m_DataSaver.SaveXML( sModuleNameAndLeaks , MEM_LEAK_MODULE );
hgs
parents:
diff changeset
   506
			}
hgs
parents:
diff changeset
   507
		}
hgs
parents:
diff changeset
   508
		
hgs
parents:
diff changeset
   509
		if ( m_vHandleLeaks.size() > 0 )
hgs
parents:
diff changeset
   510
		{
hgs
parents:
diff changeset
   511
			// We have handle leaks
hgs
parents:
diff changeset
   512
			bool bHandLeaksFound = false;
hgs
parents:
diff changeset
   513
			int iTotalNrOfLeaks = 0;
hgs
parents:
diff changeset
   514
			// Print handle leaks
hgs
parents:
diff changeset
   515
			for( size_t i = 0 ; i < m_vHandleLeaks.size() ; i++ )
hgs
parents:
diff changeset
   516
			{
hgs
parents:
diff changeset
   517
				string sTempHandleLeak( m_vHandleLeaks[i] );
hgs
parents:
diff changeset
   518
				// Count.
hgs
parents:
diff changeset
   519
				string sNrOfLeaks( GetStringUntilNextSpace(sTempHandleLeak) );
hgs
parents:
diff changeset
   520
hgs
parents:
diff changeset
   521
				// Name.
hgs
parents:
diff changeset
   522
				//string sHandleLeakModule( GetStringUntilNextSpace( sTempHandleLeak ) );
hgs
parents:
diff changeset
   523
				string sHandleLeakModule( "Unknown" );
hgs
parents:
diff changeset
   524
hgs
parents:
diff changeset
   525
				unsigned long iNrOfLeaks = _httoi( sNrOfLeaks.c_str() );
hgs
parents:
diff changeset
   526
				iTotalNrOfLeaks += iNrOfLeaks;
hgs
parents:
diff changeset
   527
				if( iNrOfLeaks )
hgs
parents:
diff changeset
   528
				{
hgs
parents:
diff changeset
   529
					if( !bHandLeaksFound )
hgs
parents:
diff changeset
   530
					{
hgs
parents:
diff changeset
   531
						m_DataSaver.SaveXML( sNrOfLeaks , HANDLE_LEAKS );
hgs
parents:
diff changeset
   532
					}
hgs
parents:
diff changeset
   533
					bHandLeaksFound = true;
hgs
parents:
diff changeset
   534
					m_DataSaver.AddInteger( iNrOfLeaks );
hgs
parents:
diff changeset
   535
					// Just print out how many leaks found.
hgs
parents:
diff changeset
   536
					// Because its always unknown.
hgs
parents:
diff changeset
   537
					m_DataSaver.AddString( " handle leak(s) found." );
hgs
parents:
diff changeset
   538
					m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   539
hgs
parents:
diff changeset
   540
					// xml
hgs
parents:
diff changeset
   541
					string sXMLInfo( sHandleLeakModule );
hgs
parents:
diff changeset
   542
					sXMLInfo.append( ";" ); sXMLInfo.append( sNrOfLeaks );
hgs
parents:
diff changeset
   543
					m_DataSaver.SaveXML( sXMLInfo , HANDLE_LEAK_MODULE );
hgs
parents:
diff changeset
   544
				}
hgs
parents:
diff changeset
   545
			}
hgs
parents:
diff changeset
   546
			// Update number if handle leaks
hgs
parents:
diff changeset
   547
			m_DataSaver.SaveXML( itoa( iTotalNrOfLeaks, cTemp, 10 ) , HANDLE_LEAKS );
hgs
parents:
diff changeset
   548
			if( !bHandLeaksFound )
hgs
parents:
diff changeset
   549
			{
hgs
parents:
diff changeset
   550
				//m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   551
				m_DataSaver.AddString( TEXT_NO_HANDLE_LEAKS );
hgs
parents:
diff changeset
   552
				m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   553
			}
hgs
parents:
diff changeset
   554
		}
hgs
parents:
diff changeset
   555
		else
hgs
parents:
diff changeset
   556
		{
hgs
parents:
diff changeset
   557
			// No handle leaks
hgs
parents:
diff changeset
   558
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   559
			m_DataSaver.AddString( TEXT_NO_HANDLE_LEAKS );
hgs
parents:
diff changeset
   560
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   561
		}
hgs
parents:
diff changeset
   562
hgs
parents:
diff changeset
   563
		// Process end to xml
hgs
parents:
diff changeset
   564
		m_DataSaver.SaveXML( sTime, RUN_END );
hgs
parents:
diff changeset
   565
		// Reset current process
hgs
parents:
diff changeset
   566
		m_iCurrentProcessId = 0;
hgs
parents:
diff changeset
   567
	}
hgs
parents:
diff changeset
   568
	
hgs
parents:
diff changeset
   569
	// If no dll load or process start found
hgs
parents:
diff changeset
   570
	if ( ! m_bProcessStartFound || !m_bDllLoadFound )
hgs
parents:
diff changeset
   571
	{
hgs
parents:
diff changeset
   572
		m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   573
		m_DataSaver.AddString( AT_ANALYZE_INSUFFICIENT_LOGGING_DATA );
hgs
parents:
diff changeset
   574
		m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   575
	}
hgs
parents:
diff changeset
   576
	
hgs
parents:
diff changeset
   577
	return true;
hgs
parents:
diff changeset
   578
}
hgs
parents:
diff changeset
   579
hgs
parents:
diff changeset
   580
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   581
// CATDatParser::ParseDllLoad
hgs
parents:
diff changeset
   582
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   583
bool CATDatParser::ParseDllLoad( string& sLine )
hgs
parents:
diff changeset
   584
{
hgs
parents:
diff changeset
   585
	LOG_FUNC_ENTRY("CATDatParser::ParseDllLoad");
hgs
parents:
diff changeset
   586
	//DLL_LOAD <DLL name> <Time stamp> <Memory start address> <Memory end address>
hgs
parents:
diff changeset
   587
	m_bDllLoadFound = true;
hgs
parents:
diff changeset
   588
	DLL_LOAD_INFO structDllInfo;
hgs
parents:
diff changeset
   589
	structDllInfo.iStartAddress = 0;
hgs
parents:
diff changeset
   590
	structDllInfo.iEndAddress = 0;
hgs
parents:
diff changeset
   591
	structDllInfo.iLeaks = 0;
hgs
parents:
diff changeset
   592
hgs
parents:
diff changeset
   593
	// Skip "DLL_LOAD "
hgs
parents:
diff changeset
   594
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   595
hgs
parents:
diff changeset
   596
	// Get module name
hgs
parents:
diff changeset
   597
	structDllInfo.sModuleName = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   598
	ChangeToLower( structDllInfo.sModuleName );
hgs
parents:
diff changeset
   599
hgs
parents:
diff changeset
   600
	// Create module from this if project platform emulator
hgs
parents:
diff changeset
   601
	if ( _stricmp( "winscw", m_sProjectPlatform.c_str() ) == 0 )
hgs
parents:
diff changeset
   602
		CreateWinscwModule( structDllInfo.sModuleName );
hgs
parents:
diff changeset
   603
hgs
parents:
diff changeset
   604
	// Get dll start memory string address from line
hgs
parents:
diff changeset
   605
	// Convert string address to real memory address
hgs
parents:
diff changeset
   606
	structDllInfo.iStartAddress = 
hgs
parents:
diff changeset
   607
		_httoi( GetStringUntilNextSpace( sLine ).c_str() );
hgs
parents:
diff changeset
   608
hgs
parents:
diff changeset
   609
	// Get dll end memory string address from line
hgs
parents:
diff changeset
   610
	// Convert string address to real memory address
hgs
parents:
diff changeset
   611
	structDllInfo.iEndAddress = 
hgs
parents:
diff changeset
   612
		_httoi( 
hgs
parents:
diff changeset
   613
		GetStringUntilNextSpace( sLine ).c_str() );
hgs
parents:
diff changeset
   614
hgs
parents:
diff changeset
   615
	if ( m_iDataVersion >= AT_DLL_TIMESTAMP_DATA_VERSION )
hgs
parents:
diff changeset
   616
	{
hgs
parents:
diff changeset
   617
		// Pickup module loading time.
hgs
parents:
diff changeset
   618
		string sLoadTime = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   619
		unsigned long long ull;
hgs
parents:
diff changeset
   620
		if ( hexToDec( sLoadTime, ull ) )
hgs
parents:
diff changeset
   621
			structDllInfo.iLoadTime = ull;
hgs
parents:
diff changeset
   622
	}
hgs
parents:
diff changeset
   623
hgs
parents:
diff changeset
   624
	// Is module already loaded, if not add it to list.
hgs
parents:
diff changeset
   625
	bool bFound = false;
hgs
parents:
diff changeset
   626
	for( vector<DLL_LOAD_INFO>::iterator it = m_vDllLoadModList.begin();
hgs
parents:
diff changeset
   627
		it != m_vDllLoadModList.end() ; it++ )
hgs
parents:
diff changeset
   628
	{
hgs
parents:
diff changeset
   629
		if( (*it).sModuleName.compare( structDllInfo.sModuleName ) == 0 )
hgs
parents:
diff changeset
   630
		{
hgs
parents:
diff changeset
   631
			bFound = true;
hgs
parents:
diff changeset
   632
			break;
hgs
parents:
diff changeset
   633
		}
hgs
parents:
diff changeset
   634
	}
hgs
parents:
diff changeset
   635
	if( ! bFound )
hgs
parents:
diff changeset
   636
		m_vDllLoadModList.push_back( structDllInfo );
hgs
parents:
diff changeset
   637
hgs
parents:
diff changeset
   638
	// Sub test module list.
hgs
parents:
diff changeset
   639
	bFound = false;
hgs
parents:
diff changeset
   640
	for( vector<DLL_LOAD_INFO>::iterator it = m_vDllLoadModListSubTest.begin();
hgs
parents:
diff changeset
   641
		it != m_vDllLoadModListSubTest.end() ; it++ )
hgs
parents:
diff changeset
   642
	{
hgs
parents:
diff changeset
   643
		if( (*it).sModuleName.compare( structDllInfo.sModuleName ) == 0 )
hgs
parents:
diff changeset
   644
		{
hgs
parents:
diff changeset
   645
			bFound = true;
hgs
parents:
diff changeset
   646
			break;
hgs
parents:
diff changeset
   647
		}
hgs
parents:
diff changeset
   648
	}
hgs
parents:
diff changeset
   649
	if( ! bFound )
hgs
parents:
diff changeset
   650
		m_vDllLoadModListSubTest.push_back( structDllInfo );
hgs
parents:
diff changeset
   651
hgs
parents:
diff changeset
   652
	return true;
hgs
parents:
diff changeset
   653
}
hgs
parents:
diff changeset
   654
hgs
parents:
diff changeset
   655
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   656
// CATDatParser::ParseDllUnload
hgs
parents:
diff changeset
   657
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   658
bool CATDatParser::ParseDllUnload( string& sLine )
hgs
parents:
diff changeset
   659
{
hgs
parents:
diff changeset
   660
	LOG_FUNC_ENTRY("CATDatParser::ParseDllUnload");
hgs
parents:
diff changeset
   661
hgs
parents:
diff changeset
   662
	// Ignore unloads on older version because no timestamps.
hgs
parents:
diff changeset
   663
	if ( m_iDataVersion < AT_DLL_TIMESTAMP_DATA_VERSION )
hgs
parents:
diff changeset
   664
	{
hgs
parents:
diff changeset
   665
		return true;
hgs
parents:
diff changeset
   666
	}
hgs
parents:
diff changeset
   667
hgs
parents:
diff changeset
   668
	// Skip "DLL_UNLOAD "
hgs
parents:
diff changeset
   669
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   670
hgs
parents:
diff changeset
   671
	// Get module name
hgs
parents:
diff changeset
   672
	string sModuleName = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   673
	ChangeToLower( sModuleName );
hgs
parents:
diff changeset
   674
hgs
parents:
diff changeset
   675
	// skip adresses - not currently used
hgs
parents:
diff changeset
   676
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   677
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   678
hgs
parents:
diff changeset
   679
	// Unload time
hgs
parents:
diff changeset
   680
	unsigned long long ull;
hgs
parents:
diff changeset
   681
	string sUnload = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   682
	if ( ! hexToDec( sUnload, ull ) )
hgs
parents:
diff changeset
   683
		return true;
hgs
parents:
diff changeset
   684
hgs
parents:
diff changeset
   685
	// Set module unload time.
hgs
parents:
diff changeset
   686
	vector<DLL_LOAD_INFO>::iterator it;
hgs
parents:
diff changeset
   687
	for( it = m_vDllLoadModList.begin() ; it != m_vDllLoadModList.end() ; it++ )
hgs
parents:
diff changeset
   688
	{
hgs
parents:
diff changeset
   689
		if ( sModuleName.compare( it->sModuleName ) == 0 )
hgs
parents:
diff changeset
   690
		{
hgs
parents:
diff changeset
   691
			(*it).iUnloadTime = ull;
hgs
parents:
diff changeset
   692
			break;
hgs
parents:
diff changeset
   693
		}
hgs
parents:
diff changeset
   694
	}
hgs
parents:
diff changeset
   695
	for( it = m_vDllLoadModListSubTest.begin() ; it != m_vDllLoadModListSubTest.end() ; it++ )
hgs
parents:
diff changeset
   696
	{
hgs
parents:
diff changeset
   697
		if ( sModuleName.compare( it->sModuleName ) == 0 )
hgs
parents:
diff changeset
   698
		{
hgs
parents:
diff changeset
   699
			(*it).iUnloadTime = ull;
hgs
parents:
diff changeset
   700
			break;
hgs
parents:
diff changeset
   701
		}
hgs
parents:
diff changeset
   702
	}
hgs
parents:
diff changeset
   703
	return true;
hgs
parents:
diff changeset
   704
}
hgs
parents:
diff changeset
   705
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   706
// CATDatParser::ParseLoggingCancelled
hgs
parents:
diff changeset
   707
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   708
bool CATDatParser::ParseLoggingCancelled( string& sLine )
hgs
parents:
diff changeset
   709
{
hgs
parents:
diff changeset
   710
	LOG_FUNC_ENTRY("CATDatParser::ParseLoggingCancelled");
hgs
parents:
diff changeset
   711
	// Skip text "LOGGING_CANCELLED"
hgs
parents:
diff changeset
   712
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   713
hgs
parents:
diff changeset
   714
	// Get time
hgs
parents:
diff changeset
   715
	string sTime( GetStringUntilNextSpace( sLine ) );
hgs
parents:
diff changeset
   716
	sTime = ConvertTimeToLocalTime( sTime );
hgs
parents:
diff changeset
   717
	m_DataSaver.AddString( "Logging Cancelled." );
hgs
parents:
diff changeset
   718
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   719
	return true;
hgs
parents:
diff changeset
   720
}
hgs
parents:
diff changeset
   721
hgs
parents:
diff changeset
   722
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   723
// CATDatParser::ParseHandleLeak
hgs
parents:
diff changeset
   724
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   725
bool CATDatParser::ParseHandleLeak( string& sLine )
hgs
parents:
diff changeset
   726
{
hgs
parents:
diff changeset
   727
	LOG_FUNC_ENTRY("CATDatParser::ParseHandleLeak");
hgs
parents:
diff changeset
   728
	// Skip text "HANDLE_LEAK"
hgs
parents:
diff changeset
   729
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   730
	m_vHandleLeaks.push_back( sLine );
hgs
parents:
diff changeset
   731
	return true;
hgs
parents:
diff changeset
   732
}
hgs
parents:
diff changeset
   733
hgs
parents:
diff changeset
   734
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   735
// CATDatParser::ParseTestStart
hgs
parents:
diff changeset
   736
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   737
bool CATDatParser::ParseTestStart( string& sLine )
hgs
parents:
diff changeset
   738
{
hgs
parents:
diff changeset
   739
	LOG_FUNC_ENTRY("CATDatParser::ParseTestStart");
hgs
parents:
diff changeset
   740
	m_bSubtestOnGoing = true;
hgs
parents:
diff changeset
   741
	m_iLeakNumber = 0;
hgs
parents:
diff changeset
   742
	m_iPinPointedSubTestLeaks = 0;
hgs
parents:
diff changeset
   743
hgs
parents:
diff changeset
   744
	// Reset subtest leaked modules list
hgs
parents:
diff changeset
   745
	for( size_t i = 0 ; i < m_vDllLoadModListSubTest.size() ; i++ )
hgs
parents:
diff changeset
   746
	{
hgs
parents:
diff changeset
   747
		m_vDllLoadModListSubTest.at(i).iLeaks = 0;
hgs
parents:
diff changeset
   748
	}
hgs
parents:
diff changeset
   749
hgs
parents:
diff changeset
   750
	// Skip text "TEST_START"
hgs
parents:
diff changeset
   751
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   752
	// Time
hgs
parents:
diff changeset
   753
	string sTime( GetStringUntilNextSpace( sLine ) );
hgs
parents:
diff changeset
   754
	sTime = ConvertTimeToLocalTime( sTime );
hgs
parents:
diff changeset
   755
	// Name
hgs
parents:
diff changeset
   756
	string sSubTestName( GetStringUntilNextSpace( sLine ) );				
hgs
parents:
diff changeset
   757
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   758
hgs
parents:
diff changeset
   759
	// Get handle count in subtest start
hgs
parents:
diff changeset
   760
	string sSubTestStartHandleCount( GetStringUntilNextSpace( sLine ) );
hgs
parents:
diff changeset
   761
	m_iSubtestStartHandleCount = atoi( sSubTestStartHandleCount.c_str() );
hgs
parents:
diff changeset
   762
hgs
parents:
diff changeset
   763
	// Add start to report
hgs
parents:
diff changeset
   764
	m_DataSaver.AddString( "\nSub test (" );
hgs
parents:
diff changeset
   765
	m_DataSaver.AddString( sSubTestName.c_str() );
hgs
parents:
diff changeset
   766
	m_DataSaver.AddString( ") start: " );
hgs
parents:
diff changeset
   767
	m_DataSaver.AddString( sTime.c_str() );
hgs
parents:
diff changeset
   768
hgs
parents:
diff changeset
   769
	// m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   770
hgs
parents:
diff changeset
   771
	// Add start to xml
hgs
parents:
diff changeset
   772
	string sResult( sSubTestName );
hgs
parents:
diff changeset
   773
	sResult.append( ";" );
hgs
parents:
diff changeset
   774
	sResult.append( sTime );
hgs
parents:
diff changeset
   775
	sResult.append( ";" );
hgs
parents:
diff changeset
   776
	m_DataSaver.SaveXML( sResult, TEST_START );
hgs
parents:
diff changeset
   777
	return true;
hgs
parents:
diff changeset
   778
}
hgs
parents:
diff changeset
   779
hgs
parents:
diff changeset
   780
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   781
// CATDatParser::ParseTestEnd
hgs
parents:
diff changeset
   782
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   783
bool CATDatParser::ParseTestEnd( string& sLine )
hgs
parents:
diff changeset
   784
{
hgs
parents:
diff changeset
   785
	LOG_FUNC_ENTRY("CATDatParser::ParseTestEnd");
hgs
parents:
diff changeset
   786
	// Skip text "TEST_END"
hgs
parents:
diff changeset
   787
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   788
hgs
parents:
diff changeset
   789
	// Time
hgs
parents:
diff changeset
   790
	string sTime( GetStringUntilNextSpace( sLine ) );
hgs
parents:
diff changeset
   791
	sTime = ConvertTimeToLocalTime( sTime );
hgs
parents:
diff changeset
   792
hgs
parents:
diff changeset
   793
	// Name
hgs
parents:
diff changeset
   794
	string sSubTestName( GetStringUntilNextSpace( sLine ) );
hgs
parents:
diff changeset
   795
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   796
hgs
parents:
diff changeset
   797
	// Add test end info to report
hgs
parents:
diff changeset
   798
	m_DataSaver.AddString( "Sub test (" );
hgs
parents:
diff changeset
   799
	m_DataSaver.AddString( sSubTestName.c_str() );
hgs
parents:
diff changeset
   800
	m_DataSaver.AddString( ") end: " );
hgs
parents:
diff changeset
   801
	m_DataSaver.AddString( sTime.c_str() );
hgs
parents:
diff changeset
   802
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   803
hgs
parents:
diff changeset
   804
	// Leak count to report in subtest
hgs
parents:
diff changeset
   805
	if( m_iLeakNumber > 0 )
hgs
parents:
diff changeset
   806
	{
hgs
parents:
diff changeset
   807
		if ( m_iLogLevel == 1 || m_iLogLevel == 2 )
hgs
parents:
diff changeset
   808
		{
hgs
parents:
diff changeset
   809
			m_DataSaver.AddInteger( m_iPinPointedSubTestLeaks );
hgs
parents:
diff changeset
   810
			m_DataSaver.AddString( " number of pinpointed memory leaks." );
hgs
parents:
diff changeset
   811
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   812
			m_DataSaver.AddInteger( m_iLeakNumber );
hgs
parents:
diff changeset
   813
			m_DataSaver.AddString( " memory leaks found." );
hgs
parents:
diff changeset
   814
		}
hgs
parents:
diff changeset
   815
		else
hgs
parents:
diff changeset
   816
		{
hgs
parents:
diff changeset
   817
			m_DataSaver.AddInteger( m_iLeakNumber );
hgs
parents:
diff changeset
   818
			m_DataSaver.AddString( " memory leaks found." );
hgs
parents:
diff changeset
   819
		}
hgs
parents:
diff changeset
   820
	}
hgs
parents:
diff changeset
   821
	else
hgs
parents:
diff changeset
   822
	{
hgs
parents:
diff changeset
   823
		m_DataSaver.AddString( "No memory leaks found." );
hgs
parents:
diff changeset
   824
	}
hgs
parents:
diff changeset
   825
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   826
hgs
parents:
diff changeset
   827
	// Use sTime to store info to xml
hgs
parents:
diff changeset
   828
	sTime.append(";");
hgs
parents:
diff changeset
   829
	char cTemp[128];
hgs
parents:
diff changeset
   830
	// Print all modules whitch have leaks
hgs
parents:
diff changeset
   831
	for( unsigned int i = 0 ; i < m_vDllLoadModListSubTest.size() ; i++ )
hgs
parents:
diff changeset
   832
	{
hgs
parents:
diff changeset
   833
		if( m_vDllLoadModListSubTest.at(i).iLeaks > 0 )
hgs
parents:
diff changeset
   834
		{
hgs
parents:
diff changeset
   835
			// Normal report
hgs
parents:
diff changeset
   836
			m_DataSaver.AddInteger( m_vDllLoadModListSubTest[i].iLeaks );
hgs
parents:
diff changeset
   837
			m_DataSaver.AddString( " memory leaks in module: " );
hgs
parents:
diff changeset
   838
			m_DataSaver.AddString( m_vDllLoadModListSubTest.at(i).sModuleName.c_str() );
hgs
parents:
diff changeset
   839
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   840
			// xml
hgs
parents:
diff changeset
   841
			string sModuleNameAndLeaks( m_vDllLoadModListSubTest.at(i).sModuleName );
hgs
parents:
diff changeset
   842
			sModuleNameAndLeaks.append(";");
hgs
parents:
diff changeset
   843
			sModuleNameAndLeaks.append( itoa( m_vDllLoadModListSubTest.at(i).iLeaks, cTemp, 10 ) );
hgs
parents:
diff changeset
   844
			m_DataSaver.SaveXML( sModuleNameAndLeaks , SUBTEST_MEM_LEAK_MODULE );
hgs
parents:
diff changeset
   845
		}
hgs
parents:
diff changeset
   846
	}
hgs
parents:
diff changeset
   847
	// Handle count
hgs
parents:
diff changeset
   848
	int iEndHandleCount = atoi( GetStringUntilNextSpace( sLine ).c_str() );
hgs
parents:
diff changeset
   849
	// Is there handle leaks in subtest?
hgs
parents:
diff changeset
   850
	if( iEndHandleCount > m_iSubtestStartHandleCount )
hgs
parents:
diff changeset
   851
	{
hgs
parents:
diff changeset
   852
		// Print normal report
hgs
parents:
diff changeset
   853
		m_DataSaver.AddInteger( iEndHandleCount - m_iSubtestStartHandleCount );
hgs
parents:
diff changeset
   854
		m_DataSaver.AddString( " handle leaks in subtest: " );
hgs
parents:
diff changeset
   855
		m_DataSaver.AddString( sSubTestName.c_str() );
hgs
parents:
diff changeset
   856
		m_DataSaver.AddString( "." );
hgs
parents:
diff changeset
   857
		m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   858
hgs
parents:
diff changeset
   859
		// Print handle leaks to XML
hgs
parents:
diff changeset
   860
		string sNrOfHandleLeaks( itoa( iEndHandleCount - m_iSubtestStartHandleCount, cTemp, 10 ) );
hgs
parents:
diff changeset
   861
		sNrOfHandleLeaks.append( ";" );
hgs
parents:
diff changeset
   862
		m_DataSaver.SaveXML( sNrOfHandleLeaks, SUBTEST_HANDLE_LEAKS );
hgs
parents:
diff changeset
   863
	}
hgs
parents:
diff changeset
   864
	else
hgs
parents:
diff changeset
   865
	{
hgs
parents:
diff changeset
   866
		// No handle leaks
hgs
parents:
diff changeset
   867
		m_DataSaver.AddString( TEXT_NO_HANDLE_LEAKS );
hgs
parents:
diff changeset
   868
		m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   869
	}
hgs
parents:
diff changeset
   870
	// Save xml
hgs
parents:
diff changeset
   871
	m_DataSaver.SaveXML( sTime, TEST_END );
hgs
parents:
diff changeset
   872
	// Back to normal leaks
hgs
parents:
diff changeset
   873
	m_bSubtestOnGoing = false;
hgs
parents:
diff changeset
   874
	return true;
hgs
parents:
diff changeset
   875
}
hgs
parents:
diff changeset
   876
hgs
parents:
diff changeset
   877
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   878
// CATDatParser::ParseErrorOccured
hgs
parents:
diff changeset
   879
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   880
bool CATDatParser::ParseErrorOccured( string& sLine )
hgs
parents:
diff changeset
   881
{
hgs
parents:
diff changeset
   882
	LOG_FUNC_ENTRY("CATDatParser::ParseErrorOccured");
hgs
parents:
diff changeset
   883
	string sTime,sError;
hgs
parents:
diff changeset
   884
hgs
parents:
diff changeset
   885
	// Skip text "ERROR_OCCURED:"
hgs
parents:
diff changeset
   886
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   887
hgs
parents:
diff changeset
   888
	// Get error
hgs
parents:
diff changeset
   889
	sError = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   890
	// Get and convert error time
hgs
parents:
diff changeset
   891
	sTime = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   892
	sTime = ConvertTimeToLocalTime( sTime );
hgs
parents:
diff changeset
   893
hgs
parents:
diff changeset
   894
	// Print error line
hgs
parents:
diff changeset
   895
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   896
	m_DataSaver.AddString( "Error occured on: " );
hgs
parents:
diff changeset
   897
	m_DataSaver.AddString( sTime.c_str() );
hgs
parents:
diff changeset
   898
	m_DataSaver.AddString( ". " );
hgs
parents:
diff changeset
   899
	m_DataSaver.AddString( "Symbian error code: " );
hgs
parents:
diff changeset
   900
	m_DataSaver.AddString( sError.c_str() );
hgs
parents:
diff changeset
   901
	m_DataSaver.AddString( "." );
hgs
parents:
diff changeset
   902
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
   903
hgs
parents:
diff changeset
   904
	return true;
hgs
parents:
diff changeset
   905
}
hgs
parents:
diff changeset
   906
hgs
parents:
diff changeset
   907
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   908
// CATDatParser::ParseMemLeak
hgs
parents:
diff changeset
   909
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   910
bool CATDatParser::ParseMemLeak( string& sLine )
hgs
parents:
diff changeset
   911
{
hgs
parents:
diff changeset
   912
	LOG_FUNC_ENTRY("CATDatParser::ParseMemLeak");
hgs
parents:
diff changeset
   913
	// Increment leak count
hgs
parents:
diff changeset
   914
	if ( ! m_bSubtestOnGoing )
hgs
parents:
diff changeset
   915
		m_iTotalNumberOfLeaks++;
hgs
parents:
diff changeset
   916
hgs
parents:
diff changeset
   917
	// Increase leak number
hgs
parents:
diff changeset
   918
	m_iLeakNumber++;
hgs
parents:
diff changeset
   919
hgs
parents:
diff changeset
   920
	// Leak data variables
hgs
parents:
diff changeset
   921
	string sModuleName;
hgs
parents:
diff changeset
   922
	string sLeakSize;
hgs
parents:
diff changeset
   923
	string sTime;
hgs
parents:
diff changeset
   924
	unsigned long long iTime = 0;
hgs
parents:
diff changeset
   925
	string sLeakAddress;
hgs
parents:
diff changeset
   926
	
hgs
parents:
diff changeset
   927
	// Skip text "MEM_LEAK"
hgs
parents:
diff changeset
   928
	GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   929
	// Get leak address
hgs
parents:
diff changeset
   930
	sLeakAddress = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   931
	// Get time
hgs
parents:
diff changeset
   932
	sTime = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   933
	// Convert time to decimal
hgs
parents:
diff changeset
   934
	hexToDec( sTime, iTime );
hgs
parents:
diff changeset
   935
	// Get memory reserve size
hgs
parents:
diff changeset
   936
	sLeakSize = GetStringUntilNextSpace( sLine );
hgs
parents:
diff changeset
   937
	// Convert leak time
hgs
parents:
diff changeset
   938
	sTime = ConvertTimeToLocalTime( sTime );
hgs
parents:
diff changeset
   939
hgs
parents:
diff changeset
   940
	// Loop thru call stack and put memory addresses in vector
hgs
parents:
diff changeset
   941
	CleanMemoryAddresses(); // Clean memory address vector
hgs
parents:
diff changeset
   942
	CATMemoryAddress* pMemAddr = 0;
hgs
parents:
diff changeset
   943
	vector<string> vStrings = ParseStringToVector( sLine, ' ' );
hgs
parents:
diff changeset
   944
	for( size_t i = 0; i < vStrings.size() ; i++ )
hgs
parents:
diff changeset
   945
	{
hgs
parents:
diff changeset
   946
		pMemAddr = new CATMemoryAddress( vStrings.at(i), m_iOffSet );
hgs
parents:
diff changeset
   947
		// Set address time
hgs
parents:
diff changeset
   948
		pMemAddr->SetTime( iTime );
hgs
parents:
diff changeset
   949
		// Set address module name
hgs
parents:
diff changeset
   950
		if ( pMemAddr->FindSetModuleName( &m_vDllLoadModList ) )
hgs
parents:
diff changeset
   951
		{
hgs
parents:
diff changeset
   952
			// Increment leaks in module once
hgs
parents:
diff changeset
   953
			if ( sModuleName.empty() )
hgs
parents:
diff changeset
   954
			{
hgs
parents:
diff changeset
   955
				if ( m_bSubtestOnGoing )
hgs
parents:
diff changeset
   956
					m_vDllLoadModListSubTest.at( pMemAddr->GetDllLoadInfoIndex() ).iLeaks++;
hgs
parents:
diff changeset
   957
				else
hgs
parents:
diff changeset
   958
					m_vDllLoadModList.at( pMemAddr->GetDllLoadInfoIndex() ).iLeaks++;
hgs
parents:
diff changeset
   959
				// Set leak's module where it was located.
hgs
parents:
diff changeset
   960
				sModuleName = pMemAddr->GetModuleName();
hgs
parents:
diff changeset
   961
			}
hgs
parents:
diff changeset
   962
		}
hgs
parents:
diff changeset
   963
		// Add it to vector
hgs
parents:
diff changeset
   964
		m_vMemoryAddress.push_back( pMemAddr );
hgs
parents:
diff changeset
   965
	}
hgs
parents:
diff changeset
   966
	// If logging level is 0 Skip printing / locating code lines for call stack items.
hgs
parents:
diff changeset
   967
	if ( m_iLogLevel == 0 )
hgs
parents:
diff changeset
   968
		return true;
hgs
parents:
diff changeset
   969
	if ( m_pModules && vStrings.size() > 0 )
hgs
parents:
diff changeset
   970
	{
hgs
parents:
diff changeset
   971
		// Have we successfully located code line for memory address
hgs
parents:
diff changeset
   972
		bool bSuccesfullAddressToLine = false;
hgs
parents:
diff changeset
   973
		for( size_t x = 0; x < m_vMemoryAddress.size(); x++ )
hgs
parents:
diff changeset
   974
		{
hgs
parents:
diff changeset
   975
			int iIndexInDll = m_vMemoryAddress.at( x )->GetDllLoadInfoIndex();
hgs
parents:
diff changeset
   976
			if ( iIndexInDll != -1 )
hgs
parents:
diff changeset
   977
			{
hgs
parents:
diff changeset
   978
				// Dll module name from data file
hgs
parents:
diff changeset
   979
				string sDllName = m_vDllLoadModList.at( iIndexInDll ).sModuleName;
hgs
parents:
diff changeset
   980
				// Find module from project. These are read from makefiles.
hgs
parents:
diff changeset
   981
				for ( size_t y = 0; y < m_pModules->size() ; y++ )
hgs
parents:
diff changeset
   982
				{
hgs
parents:
diff changeset
   983
					// Module name from project data (makefiles)
hgs
parents:
diff changeset
   984
					string sModuleName = m_pModules->at( y )->GetBinaryName();
hgs
parents:
diff changeset
   985
					// If we find module from project ones, use it to located code line for memory address
hgs
parents:
diff changeset
   986
					// Note! dll names can be pretty messy i.e. DLL_LOAD 10281fc6.dll{000a0000}[10281fc6] 81d57b88 81e60a90
hgs
parents:
diff changeset
   987
					if ( sDllName.find( sModuleName ) != string::npos )
hgs
parents:
diff changeset
   988
					{
hgs
parents:
diff changeset
   989
						m_pModules->at( y )->AddressToLine( m_vMemoryAddress.at( x ) );
hgs
parents:
diff changeset
   990
						if ( ! bSuccesfullAddressToLine )
hgs
parents:
diff changeset
   991
						{
hgs
parents:
diff changeset
   992
							int iPPState = m_vMemoryAddress.at( x )->GetAddressToLineState();
hgs
parents:
diff changeset
   993
							if ( iPPState == CATMemoryAddress::EXACT || iPPState == CATMemoryAddress::FUNCTION )
hgs
parents:
diff changeset
   994
							{
hgs
parents:
diff changeset
   995
								bSuccesfullAddressToLine = true;
hgs
parents:
diff changeset
   996
								if ( m_bSubtestOnGoing )
hgs
parents:
diff changeset
   997
									m_iPinPointedSubTestLeaks++;
hgs
parents:
diff changeset
   998
								else
hgs
parents:
diff changeset
   999
									m_iPinPointedLeaks++;
hgs
parents:
diff changeset
  1000
							}
hgs
parents:
diff changeset
  1001
						}
hgs
parents:
diff changeset
  1002
					}
hgs
parents:
diff changeset
  1003
				}
hgs
parents:
diff changeset
  1004
			}
hgs
parents:
diff changeset
  1005
		}
hgs
parents:
diff changeset
  1006
		// If rom/rofs specified we use it to try get binary and function names
hgs
parents:
diff changeset
  1007
		// for addresses currently out of process range.
hgs
parents:
diff changeset
  1008
		if ( m_pRomSymbol )
hgs
parents:
diff changeset
  1009
		{
hgs
parents:
diff changeset
  1010
			for( size_t x = 0; x < m_vMemoryAddress.size(); x++ )
hgs
parents:
diff changeset
  1011
			{
hgs
parents:
diff changeset
  1012
				if ( m_vMemoryAddress.at(x)->GetAddressToLineState() == CATMemoryAddress::OUT_OF_PROCESS
hgs
parents:
diff changeset
  1013
					|| m_vMemoryAddress.at(x)->GetAddressToLineState() == CATMemoryAddress::OUT_OF_RANGE )
hgs
parents:
diff changeset
  1014
				{
hgs
parents:
diff changeset
  1015
					m_pRomSymbol->AddressToLine( m_vMemoryAddress.at(x) );
hgs
parents:
diff changeset
  1016
				}
hgs
parents:
diff changeset
  1017
			}
hgs
parents:
diff changeset
  1018
		}
hgs
parents:
diff changeset
  1019
	}
hgs
parents:
diff changeset
  1020
	// Print leak
hgs
parents:
diff changeset
  1021
	PrintMemLeak( sTime, sLeakSize, sLeakAddress, sModuleName);
hgs
parents:
diff changeset
  1022
	return true;
hgs
parents:
diff changeset
  1023
}
hgs
parents:
diff changeset
  1024
hgs
parents:
diff changeset
  1025
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1026
// CATDatParser::PrintMemLeak
hgs
parents:
diff changeset
  1027
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1028
void CATDatParser::PrintMemLeak(const string& sTime,
hgs
parents:
diff changeset
  1029
							   const string& sLeakSize,
hgs
parents:
diff changeset
  1030
							   const string& sLeakAddr,
hgs
parents:
diff changeset
  1031
							   const string& sModuleName)
hgs
parents:
diff changeset
  1032
{
hgs
parents:
diff changeset
  1033
	LOG_FUNC_ENTRY("CATDatParser::PrintMemLeak");
hgs
parents:
diff changeset
  1034
	// Print header data of leak
hgs
parents:
diff changeset
  1035
	m_DataSaver.AddString("\nMemory leak ");
hgs
parents:
diff changeset
  1036
	m_DataSaver.AddInteger( m_iLeakNumber, true);
hgs
parents:
diff changeset
  1037
hgs
parents:
diff changeset
  1038
	// Leak size
hgs
parents:
diff changeset
  1039
	m_DataSaver.AddString( " (" );
hgs
parents:
diff changeset
  1040
	m_DataSaver.AddInteger( _httoi( sLeakSize.c_str() ), true );
hgs
parents:
diff changeset
  1041
	m_DataSaver.AddString( " bytes) " );
hgs
parents:
diff changeset
  1042
hgs
parents:
diff changeset
  1043
	// Leak address
hgs
parents:
diff changeset
  1044
	m_DataSaver.AddString("(0x");
hgs
parents:
diff changeset
  1045
	m_DataSaver.AddString( sLeakAddr.c_str(), true );
hgs
parents:
diff changeset
  1046
	m_DataSaver.AddString( ") " );
hgs
parents:
diff changeset
  1047
hgs
parents:
diff changeset
  1048
	// Time
hgs
parents:
diff changeset
  1049
	m_DataSaver.AddString( sTime.c_str(), true );
hgs
parents:
diff changeset
  1050
	m_DataSaver.AddString( " " );
hgs
parents:
diff changeset
  1051
	
hgs
parents:
diff changeset
  1052
	// Module name
hgs
parents:
diff changeset
  1053
	m_DataSaver.AddString( sModuleName.c_str(), true );
hgs
parents:
diff changeset
  1054
	m_DataSaver.SaveCarbideDataHeader();
hgs
parents:
diff changeset
  1055
	
hgs
parents:
diff changeset
  1056
	// Add header line
hgs
parents:
diff changeset
  1057
	m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
  1058
hgs
parents:
diff changeset
  1059
	// Print the call stack items
hgs
parents:
diff changeset
  1060
	for( size_t i = 0 ; i < m_vMemoryAddress.size() ; i++ )
hgs
parents:
diff changeset
  1061
	{
hgs
parents:
diff changeset
  1062
		// On log levels 1 & 2 we only print located code lines.
hgs
parents:
diff changeset
  1063
		#ifndef ADDR2LINE
hgs
parents:
diff changeset
  1064
		if( 
hgs
parents:
diff changeset
  1065
			( m_iLogLevel == 1 || m_iLogLevel == 2 )
hgs
parents:
diff changeset
  1066
			&&
hgs
parents:
diff changeset
  1067
			( m_vMemoryAddress.at(i)->GetAddressToLineState() != CATMemoryAddress::EXACT
hgs
parents:
diff changeset
  1068
			&& m_vMemoryAddress.at(i)->GetAddressToLineState() != CATMemoryAddress::FUNCTION )
hgs
parents:
diff changeset
  1069
			)
hgs
parents:
diff changeset
  1070
		{
hgs
parents:
diff changeset
  1071
			// Skips to next
hgs
parents:
diff changeset
  1072
			continue;
hgs
parents:
diff changeset
  1073
		}
hgs
parents:
diff changeset
  1074
		#endif
hgs
parents:
diff changeset
  1075
		#ifdef ADDR2LINE
hgs
parents:
diff changeset
  1076
		if( ( m_iLogLevel == 1 || m_iLogLevel == 2 )
hgs
parents:
diff changeset
  1077
			&& m_vMemoryAddress.at(i)->GetAddressToLineState() != CATMemoryAddress::EXACT )
hgs
parents:
diff changeset
  1078
		{
hgs
parents:
diff changeset
  1079
			// Skips to next
hgs
parents:
diff changeset
  1080
			continue;
hgs
parents:
diff changeset
  1081
		}
hgs
parents:
diff changeset
  1082
		#endif
hgs
parents:
diff changeset
  1083
		else if ( m_vMemoryAddress.at(i)->GetAddressToLineState() == CATMemoryAddress::OUT_OF_PROCESS )
hgs
parents:
diff changeset
  1084
		{
hgs
parents:
diff changeset
  1085
			// Is memory address out of modules range
hgs
parents:
diff changeset
  1086
			string sTemp;
hgs
parents:
diff changeset
  1087
			sTemp.append( m_vMemoryAddress.at(i)->GetAddressString() );
hgs
parents:
diff changeset
  1088
			sTemp.append( " Address out of process memory.");
hgs
parents:
diff changeset
  1089
			m_DataSaver.AddString( sTemp.c_str(), true );
hgs
parents:
diff changeset
  1090
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
  1091
			continue;
hgs
parents:
diff changeset
  1092
		}
hgs
parents:
diff changeset
  1093
		
hgs
parents:
diff changeset
  1094
		// Print memory address
hgs
parents:
diff changeset
  1095
		m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetAddressString().c_str(), true );
hgs
parents:
diff changeset
  1096
hgs
parents:
diff changeset
  1097
		// Space (only for console output)
hgs
parents:
diff changeset
  1098
		m_DataSaver.AddString( " " );
hgs
parents:
diff changeset
  1099
hgs
parents:
diff changeset
  1100
		m_DataSaver.AddCarbideData( 
hgs
parents:
diff changeset
  1101
			NumberToHexString( m_vMemoryAddress.at(i)->GetOffSetFromModuleStart() ) );
hgs
parents:
diff changeset
  1102
hgs
parents:
diff changeset
  1103
		// Module name
hgs
parents:
diff changeset
  1104
		m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetModuleName().c_str(), true );
hgs
parents:
diff changeset
  1105
hgs
parents:
diff changeset
  1106
		// Print call stack memory address details depending on state of memory address
hgs
parents:
diff changeset
  1107
		switch( m_vMemoryAddress.at(i)->GetAddressToLineState() )
hgs
parents:
diff changeset
  1108
		{
hgs
parents:
diff changeset
  1109
			// Address outside of known processes
hgs
parents:
diff changeset
  1110
		case CATMemoryAddress::OUT_OF_PROCESS:
hgs
parents:
diff changeset
  1111
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
  1112
			break;
hgs
parents:
diff changeset
  1113
			// Address located outside of known modules symbols
hgs
parents:
diff changeset
  1114
		case CATMemoryAddress::OUT_OF_RANGE:
hgs
parents:
diff changeset
  1115
			m_DataSaver.AddString( " " );
hgs
parents:
diff changeset
  1116
			m_DataSaver.AddString( "???", true );
hgs
parents:
diff changeset
  1117
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
  1118
			break;
hgs
parents:
diff changeset
  1119
		// Symbol state is currently used when using rom symbol file.
hgs
parents:
diff changeset
  1120
		// From it we get module name & function name.
hgs
parents:
diff changeset
  1121
		case CATMemoryAddress::SYMBOL:
hgs
parents:
diff changeset
  1122
			m_DataSaver.AddString( " " );
hgs
parents:
diff changeset
  1123
			m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetFunctionName().c_str(), true );
hgs
parents:
diff changeset
  1124
			if ( ! m_vMemoryAddress.at( i )->GetFileName().empty() )
hgs
parents:
diff changeset
  1125
			{
hgs
parents:
diff changeset
  1126
				m_DataSaver.AddString( " (" );
hgs
parents:
diff changeset
  1127
				m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetFileName().c_str(), true );
hgs
parents:
diff changeset
  1128
				m_DataSaver.AddString( ")" );
hgs
parents:
diff changeset
  1129
			}
hgs
parents:
diff changeset
  1130
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
  1131
			break;
hgs
parents:
diff changeset
  1132
		// Lst & Map implementation
hgs
parents:
diff changeset
  1133
		#ifndef ADDR2LINE
hgs
parents:
diff changeset
  1134
		case CATMemoryAddress::FUNCTION:
hgs
parents:
diff changeset
  1135
		case CATMemoryAddress::EXACT:
hgs
parents:
diff changeset
  1136
			m_DataSaver.AddString( " " );
hgs
parents:
diff changeset
  1137
			m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetFunctionName().c_str(), true );
hgs
parents:
diff changeset
  1138
			// Small difference displaying details depending on build urel/udeb
hgs
parents:
diff changeset
  1139
			if ( m_eBuildType == CATProject::UREL )
hgs
parents:
diff changeset
  1140
			{
hgs
parents:
diff changeset
  1141
				// UREL
hgs
parents:
diff changeset
  1142
				// Set build info to data saver
hgs
parents:
diff changeset
  1143
				m_DataSaver.SetBuild( false );
hgs
parents:
diff changeset
  1144
				// urel = functionname: linenumber (filename)
hgs
parents:
diff changeset
  1145
				m_DataSaver.AddString( ": " );
hgs
parents:
diff changeset
  1146
				if (  m_vMemoryAddress.at(i)->GetFunctionLineNumber() != -1 )
hgs
parents:
diff changeset
  1147
					m_DataSaver.AddInteger( m_vMemoryAddress.at(i)->GetFunctionLineNumber(), true );
hgs
parents:
diff changeset
  1148
				else if (  m_vMemoryAddress.at(i)->GetExactLineNumber() != -1 )
hgs
parents:
diff changeset
  1149
					m_DataSaver.AddInteger( m_vMemoryAddress.at(i)->GetExactLineNumber(), true );
hgs
parents:
diff changeset
  1150
				m_DataSaver.AddString( " (" );
hgs
parents:
diff changeset
  1151
				m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetFileName().c_str(), true );
hgs
parents:
diff changeset
  1152
				m_DataSaver.AddString( ")" );
hgs
parents:
diff changeset
  1153
				m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
  1154
			}
hgs
parents:
diff changeset
  1155
			else
hgs
parents:
diff changeset
  1156
			{
hgs
parents:
diff changeset
  1157
				// UDEB
hgs
parents:
diff changeset
  1158
				// udeb = functionname: (filename:linenumber)
hgs
parents:
diff changeset
  1159
				m_DataSaver.AddString( " (" );
hgs
parents:
diff changeset
  1160
				m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetFileName().c_str(), true );
hgs
parents:
diff changeset
  1161
				m_DataSaver.AddString( ":" );
hgs
parents:
diff changeset
  1162
				if(  m_vMemoryAddress.at(i)->GetExactLineNumber() != -1 )
hgs
parents:
diff changeset
  1163
					m_DataSaver.AddInteger( m_vMemoryAddress.at(i)->GetExactLineNumber(), true );
hgs
parents:
diff changeset
  1164
				else
hgs
parents:
diff changeset
  1165
					m_DataSaver.AddString( "???", true );
hgs
parents:
diff changeset
  1166
				m_DataSaver.AddString( ")" );
hgs
parents:
diff changeset
  1167
				m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
  1168
			}
hgs
parents:
diff changeset
  1169
			break;
hgs
parents:
diff changeset
  1170
		#endif
hgs
parents:
diff changeset
  1171
		// addr2line implementation (new).
hgs
parents:
diff changeset
  1172
		#ifdef ADDR2LINE
hgs
parents:
diff changeset
  1173
		case CATMemoryAddress::FUNCTION:
hgs
parents:
diff changeset
  1174
			m_DataSaver.AddString( " " );
hgs
parents:
diff changeset
  1175
			m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetFunctionName().c_str(), true );
hgs
parents:
diff changeset
  1176
			m_DataSaver.AddString( " (" );
hgs
parents:
diff changeset
  1177
			m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetFileName().c_str(), true );
hgs
parents:
diff changeset
  1178
			m_DataSaver.AddString( ":" );
hgs
parents:
diff changeset
  1179
			if(  m_vMemoryAddress.at(i)->GetExactLineNumber() != -1 )
hgs
parents:
diff changeset
  1180
				m_DataSaver.AddInteger( m_vMemoryAddress.at(i)->GetFunctionLineNumber(), true );
hgs
parents:
diff changeset
  1181
			else
hgs
parents:
diff changeset
  1182
				m_DataSaver.AddString( "???", true );
hgs
parents:
diff changeset
  1183
			m_DataSaver.AddString( ")" );
hgs
parents:
diff changeset
  1184
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
  1185
			break;
hgs
parents:
diff changeset
  1186
		case CATMemoryAddress::EXACT:
hgs
parents:
diff changeset
  1187
			m_DataSaver.AddString( " " );
hgs
parents:
diff changeset
  1188
			m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetFunctionName().c_str(), true );
hgs
parents:
diff changeset
  1189
			m_DataSaver.AddString( " (" );
hgs
parents:
diff changeset
  1190
			m_DataSaver.AddString( m_vMemoryAddress.at(i)->GetFileName().c_str(), true );
hgs
parents:
diff changeset
  1191
			m_DataSaver.AddString( ":" );
hgs
parents:
diff changeset
  1192
			if(  m_vMemoryAddress.at(i)->GetExactLineNumber() != -1 )
hgs
parents:
diff changeset
  1193
				m_DataSaver.AddInteger( m_vMemoryAddress.at(i)->GetExactLineNumber(), true );
hgs
parents:
diff changeset
  1194
			else
hgs
parents:
diff changeset
  1195
				m_DataSaver.AddString( "???", true );
hgs
parents:
diff changeset
  1196
			m_DataSaver.AddString( ")" );
hgs
parents:
diff changeset
  1197
			m_DataSaver.AddLineToLast();
hgs
parents:
diff changeset
  1198
			break;
hgs
parents:
diff changeset
  1199
		#endif
hgs
parents:
diff changeset
  1200
		} // End switch
hgs
parents:
diff changeset
  1201
		// On logging level 1 we only print one located code line
hgs
parents:
diff changeset
  1202
		#ifndef ADDR2LINE
hgs
parents:
diff changeset
  1203
		if ( m_iLogLevel == 1 && ( m_vMemoryAddress.at(i)->GetAddressToLineState() == CATMemoryAddress::EXACT ||
hgs
parents:
diff changeset
  1204
			m_vMemoryAddress.at(i)->GetAddressToLineState() == CATMemoryAddress::FUNCTION ) )
hgs
parents:
diff changeset
  1205
			break;
hgs
parents:
diff changeset
  1206
		#endif
hgs
parents:
diff changeset
  1207
		#ifdef ADDR2LINE
hgs
parents:
diff changeset
  1208
		if ( m_iLogLevel == 1 && m_vMemoryAddress.at(i)->GetAddressToLineState() == CATMemoryAddress::EXACT )
hgs
parents:
diff changeset
  1209
			break;
hgs
parents:
diff changeset
  1210
		#endif
hgs
parents:
diff changeset
  1211
	} // End call stack items loop
hgs
parents:
diff changeset
  1212
}
hgs
parents:
diff changeset
  1213
hgs
parents:
diff changeset
  1214
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1215
// CATDatParser::SetInputFile
hgs
parents:
diff changeset
  1216
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1217
void CATDatParser::SetInputFile(const string& sInputFile)
hgs
parents:
diff changeset
  1218
{
hgs
parents:
diff changeset
  1219
	LOG_FUNC_ENTRY("CATDatParser::SetInputFile");
hgs
parents:
diff changeset
  1220
	m_sInputFile = sInputFile;
hgs
parents:
diff changeset
  1221
}
hgs
parents:
diff changeset
  1222
hgs
parents:
diff changeset
  1223
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1224
// CATDatParser::SetOutputFile
hgs
parents:
diff changeset
  1225
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1226
void CATDatParser::SetOutputFile(const string& sOutpuFile)
hgs
parents:
diff changeset
  1227
{
hgs
parents:
diff changeset
  1228
	LOG_FUNC_ENTRY("CATDatParser::SetOutputFile");
hgs
parents:
diff changeset
  1229
	m_sOutputFile = sOutpuFile;
hgs
parents:
diff changeset
  1230
}
hgs
parents:
diff changeset
  1231
hgs
parents:
diff changeset
  1232
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1233
// CATDatParser::SetRomSymbolFiles
hgs
parents:
diff changeset
  1234
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1235
void CATDatParser::SetRomSymbolFiles(const vector<string>& vRomSymbolFiles)
hgs
parents:
diff changeset
  1236
{
hgs
parents:
diff changeset
  1237
	LOG_FUNC_ENTRY("CATDatParser::SetRomSymbolFiles");
hgs
parents:
diff changeset
  1238
	m_vRomSymbolFiles = vRomSymbolFiles;
hgs
parents:
diff changeset
  1239
}
hgs
parents:
diff changeset
  1240
hgs
parents:
diff changeset
  1241
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1242
// CATDatParser::SetLogLevel
hgs
parents:
diff changeset
  1243
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1244
void CATDatParser::SetLogLevel(int iLogLevel)
hgs
parents:
diff changeset
  1245
{
hgs
parents:
diff changeset
  1246
	LOG_FUNC_ENTRY("CATDatParser::SetLogLevel");
hgs
parents:
diff changeset
  1247
	m_iLogLevel = iLogLevel;
hgs
parents:
diff changeset
  1248
}
hgs
parents:
diff changeset
  1249
hgs
parents:
diff changeset
  1250
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1251
// CATDatParser::GetLogLevel
hgs
parents:
diff changeset
  1252
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1253
int CATDatParser::GetLogLevel() const
hgs
parents:
diff changeset
  1254
{
hgs
parents:
diff changeset
  1255
	LOG_LOW_FUNC_ENTRY("CATDatParser::GetLogLevel");
hgs
parents:
diff changeset
  1256
	return m_iLogLevel;
hgs
parents:
diff changeset
  1257
}
hgs
parents:
diff changeset
  1258
hgs
parents:
diff changeset
  1259
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1260
// CATDatParser::CleanMemoryAddresses
hgs
parents:
diff changeset
  1261
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1262
void CATDatParser::CleanMemoryAddresses()
hgs
parents:
diff changeset
  1263
{
hgs
parents:
diff changeset
  1264
	LOG_LOW_FUNC_ENTRY("CATDatParser::CleanMemoryAddresses");
hgs
parents:
diff changeset
  1265
	// Cleanup memory addressses.
hgs
parents:
diff changeset
  1266
	for( vector<CATMemoryAddress*>::iterator it = m_vMemoryAddress.begin(); it != m_vMemoryAddress.end(); it++ )
hgs
parents:
diff changeset
  1267
	{
hgs
parents:
diff changeset
  1268
		delete *it;
hgs
parents:
diff changeset
  1269
	}
hgs
parents:
diff changeset
  1270
	m_vMemoryAddress.clear();
hgs
parents:
diff changeset
  1271
}
hgs
parents:
diff changeset
  1272
hgs
parents:
diff changeset
  1273
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1274
// CATDatParser::ConvertTimeToLocalTime
hgs
parents:
diff changeset
  1275
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1276
string CATDatParser::ConvertTimeToLocalTime( string sInputTime )
hgs
parents:
diff changeset
  1277
{
hgs
parents:
diff changeset
  1278
	LOG_LOW_FUNC_ENTRY("CATDatParser::ConvertTimeToLocalTime");
hgs
parents:
diff changeset
  1279
	//Is process end abnormal?
hgs
parents:
diff changeset
  1280
	if( sInputTime.compare( LABEL_ABNORMAL ) == 0 )
hgs
parents:
diff changeset
  1281
	{
hgs
parents:
diff changeset
  1282
		return string( AT_ANALYZE_ABNORMAL_EXIT );
hgs
parents:
diff changeset
  1283
	}
hgs
parents:
diff changeset
  1284
	else
hgs
parents:
diff changeset
  1285
	// Check that input time is at least 32-bit
hgs
parents:
diff changeset
  1286
	if( sInputTime.length() <= 8 )
hgs
parents:
diff changeset
  1287
	{
hgs
parents:
diff changeset
  1288
		sInputTime.clear();
hgs
parents:
diff changeset
  1289
		return sInputTime;
hgs
parents:
diff changeset
  1290
	}
hgs
parents:
diff changeset
  1291
hgs
parents:
diff changeset
  1292
	string sTemp = sInputTime;
hgs
parents:
diff changeset
  1293
	const char* pTemp = sTemp.c_str();
hgs
parents:
diff changeset
  1294
hgs
parents:
diff changeset
  1295
	// Are all characters hex
hgs
parents:
diff changeset
  1296
	for( unsigned int i = 0 ; i < sTemp.size() ; i++ )
hgs
parents:
diff changeset
  1297
	{
hgs
parents:
diff changeset
  1298
		if( !IsHexCharacter( (pTemp + i) ) )
hgs
parents:
diff changeset
  1299
		{
hgs
parents:
diff changeset
  1300
			return sInputTime;
hgs
parents:
diff changeset
  1301
		}
hgs
parents:
diff changeset
  1302
	}
hgs
parents:
diff changeset
  1303
	
hgs
parents:
diff changeset
  1304
	// Get LSB bits
hgs
parents:
diff changeset
  1305
	string sLsb;
hgs
parents:
diff changeset
  1306
	sLsb.append( sInputTime.substr( sInputTime.length()-8, sInputTime.length() ) );
hgs
parents:
diff changeset
  1307
	unsigned int iLsbTime = (unsigned int)_httoi( sLsb.c_str() );
hgs
parents:
diff changeset
  1308
hgs
parents:
diff changeset
  1309
	// Get MSB bits
hgs
parents:
diff changeset
  1310
    string sMsb;
hgs
parents:
diff changeset
  1311
	sMsb.append( sInputTime.substr( 0, sInputTime.length()-8 ) );
hgs
parents:
diff changeset
  1312
	unsigned int iMsbTime = (unsigned int)_httoi( sMsb.c_str() );
hgs
parents:
diff changeset
  1313
hgs
parents:
diff changeset
  1314
	// Get time in microsecods
hgs
parents:
diff changeset
  1315
	long long sdf = iMsbTime * 0x100000000 + iLsbTime;
hgs
parents:
diff changeset
  1316
hgs
parents:
diff changeset
  1317
	// Get original time (starting at year 1970 )
hgs
parents:
diff changeset
  1318
	long long llOrigTime = sdf;
hgs
parents:
diff changeset
  1319
hgs
parents:
diff changeset
  1320
	// Get seconds
hgs
parents:
diff changeset
  1321
	sdf = ( sdf )/1000000;
hgs
parents:
diff changeset
  1322
		
hgs
parents:
diff changeset
  1323
	// Check that sdf contains some time value
hgs
parents:
diff changeset
  1324
	if( sdf <= 0)
hgs
parents:
diff changeset
  1325
	{
hgs
parents:
diff changeset
  1326
		// Error in time calculation
hgs
parents:
diff changeset
  1327
		// Return empty string
hgs
parents:
diff changeset
  1328
		sInputTime.clear();
hgs
parents:
diff changeset
  1329
		return sInputTime;
hgs
parents:
diff changeset
  1330
	}
hgs
parents:
diff changeset
  1331
hgs
parents:
diff changeset
  1332
	// Original time after year 1970 in seconds
hgs
parents:
diff changeset
  1333
	long long llOrignTimeInSeconds = sdf;
hgs
parents:
diff changeset
  1334
	
hgs
parents:
diff changeset
  1335
	// Calculate new time which does not include millisecods
hgs
parents:
diff changeset
  1336
	long long llDiffTime = (llOrignTimeInSeconds * 1000000);
hgs
parents:
diff changeset
  1337
hgs
parents:
diff changeset
  1338
	// Calculate time difference in milliseconds
hgs
parents:
diff changeset
  1339
	int llDiffTimeInMilliSecods = (int)( llOrigTime - llDiffTime )/1000;
hgs
parents:
diff changeset
  1340
	
hgs
parents:
diff changeset
  1341
	// Convert difference time to char
hgs
parents:
diff changeset
  1342
	char cDiffInMilliSeconds[20];
hgs
parents:
diff changeset
  1343
    _itoa( llDiffTimeInMilliSecods, cDiffInMilliSeconds, 10 );
hgs
parents:
diff changeset
  1344
hgs
parents:
diff changeset
  1345
	// Time info structure
hgs
parents:
diff changeset
  1346
	struct tm *timeinfo;
hgs
parents:
diff changeset
  1347
hgs
parents:
diff changeset
  1348
	// Get local time
hgs
parents:
diff changeset
  1349
	timeinfo = localtime ( (time_t*) &sdf );
hgs
parents:
diff changeset
  1350
hgs
parents:
diff changeset
  1351
	// Create string and append memory leak time to it
hgs
parents:
diff changeset
  1352
	string sTime;
hgs
parents:
diff changeset
  1353
	sTime.append( asctime( timeinfo ) );
hgs
parents:
diff changeset
  1354
hgs
parents:
diff changeset
  1355
	// Remove last char of locale time string which is \n
hgs
parents:
diff changeset
  1356
	sTime.resize( (int)sTime.length()-1 );
hgs
parents:
diff changeset
  1357
	
hgs
parents:
diff changeset
  1358
	// Get last space index
hgs
parents:
diff changeset
  1359
	int iLastSpace = (int)sTime.find_last_of(" ");
hgs
parents:
diff changeset
  1360
hgs
parents:
diff changeset
  1361
	// If last space index is valid
hgs
parents:
diff changeset
  1362
	if( iLastSpace <= (int)sTime.length() && iLastSpace > 0)
hgs
parents:
diff changeset
  1363
	{
hgs
parents:
diff changeset
  1364
		string sTempTime;
hgs
parents:
diff changeset
  1365
		// Append first part of original time string
hgs
parents:
diff changeset
  1366
		sTempTime.append( sTime.substr( 0, iLastSpace ) );
hgs
parents:
diff changeset
  1367
		
hgs
parents:
diff changeset
  1368
		// Append millisecods
hgs
parents:
diff changeset
  1369
		sTempTime.append( "." );
hgs
parents:
diff changeset
  1370
		sTempTime.append( cDiffInMilliSeconds );
hgs
parents:
diff changeset
  1371
hgs
parents:
diff changeset
  1372
		// Append the rest of the original time string part
hgs
parents:
diff changeset
  1373
		sTempTime.append( sTime.substr( iLastSpace, sTime.length()));
hgs
parents:
diff changeset
  1374
hgs
parents:
diff changeset
  1375
		// Clear original and append new time string which includes millisecods
hgs
parents:
diff changeset
  1376
		sTime.clear();
hgs
parents:
diff changeset
  1377
		sTime.append( sTempTime );
hgs
parents:
diff changeset
  1378
	}
hgs
parents:
diff changeset
  1379
hgs
parents:
diff changeset
  1380
	// Return memory leak time
hgs
parents:
diff changeset
  1381
	return sTime.c_str();
hgs
parents:
diff changeset
  1382
}
hgs
parents:
diff changeset
  1383
hgs
parents:
diff changeset
  1384
bool CATDatParser::CreateWinscwModule( const string& sBinaryName )
hgs
parents:
diff changeset
  1385
{
hgs
parents:
diff changeset
  1386
	LOG_FUNC_ENTRY( "CATDatParser::CreateWinscwModule" );
hgs
parents:
diff changeset
  1387
	// Is module already created?
hgs
parents:
diff changeset
  1388
	for( vector<CATModule2*>::iterator it = m_pModules->begin(); it != m_pModules->end(); it++ )
hgs
parents:
diff changeset
  1389
	{
hgs
parents:
diff changeset
  1390
		if ( _stricmp( sBinaryName.c_str(), (*it)->GetBinaryName().c_str() ) == 0 )
hgs
parents:
diff changeset
  1391
			return true;
hgs
parents:
diff changeset
  1392
	}
hgs
parents:
diff changeset
  1393
	// No create new one and set its values.
hgs
parents:
diff changeset
  1394
	CATModule2* mod = new CATModule2();
hgs
parents:
diff changeset
  1395
	mod->SetTarget( RemovePathAndExt( sBinaryName, true ) );
hgs
parents:
diff changeset
  1396
	mod->SetRequestedTargetExt( GetExtension( sBinaryName ) );
hgs
parents:
diff changeset
  1397
	mod->SetReleasePath( string( "\\epoc32\\release" ) );
hgs
parents:
diff changeset
  1398
	if ( m_eBuildType == CATProject::UDEB )
hgs
parents:
diff changeset
  1399
		mod->SetFullVariantPath( string( "winscw\\udeb" ) );
hgs
parents:
diff changeset
  1400
	else
hgs
parents:
diff changeset
  1401
		mod->SetFullVariantPath( string( "winscw\\urel" ) );
hgs
parents:
diff changeset
  1402
	mod->SetVariantPlatform( string( "winscw" ) );
hgs
parents:
diff changeset
  1403
	m_pModules->push_back( mod );
hgs
parents:
diff changeset
  1404
	return true;
hgs
parents:
diff changeset
  1405
}
hgs
parents:
diff changeset
  1406
hgs
parents:
diff changeset
  1407
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1408
// CATDatParser::FindModuleUsingAddress
hgs
parents:
diff changeset
  1409
// Function finds module using given address.
hgs
parents:
diff changeset
  1410
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1411
int CATDatParser::FindModuleUsingAddress( unsigned long iAddress ) const
hgs
parents:
diff changeset
  1412
{
hgs
parents:
diff changeset
  1413
	LOG_LOW_FUNC_ENTRY("CATDatParser::FindModuleUsingAddress");
hgs
parents:
diff changeset
  1414
	int iRet = -1;
hgs
parents:
diff changeset
  1415
	for( unsigned int i = 0 ; i < m_vDllLoadModList.size() ; i++ )
hgs
parents:
diff changeset
  1416
	{
hgs
parents:
diff changeset
  1417
		// Is address between start and end address?
hgs
parents:
diff changeset
  1418
		if( iAddress > m_vDllLoadModList[i].iStartAddress && iAddress < m_vDllLoadModList[i].iEndAddress )
hgs
parents:
diff changeset
  1419
		{
hgs
parents:
diff changeset
  1420
			iRet = i;
hgs
parents:
diff changeset
  1421
			break;
hgs
parents:
diff changeset
  1422
		}	
hgs
parents:
diff changeset
  1423
	}
hgs
parents:
diff changeset
  1424
	return iRet;
hgs
parents:
diff changeset
  1425
}
hgs
parents:
diff changeset
  1426
hgs
parents:
diff changeset
  1427
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1428
// CATDatParser::FindModuleUsingPID
hgs
parents:
diff changeset
  1429
// Function finds module using module id.
hgs
parents:
diff changeset
  1430
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1431
/*
hgs
parents:
diff changeset
  1432
int CATDatParser::FindModuleUsingPID( unsigned long iPID ) const
hgs
parents:
diff changeset
  1433
{
hgs
parents:
diff changeset
  1434
	LOG_FUNC_ENTRY("CATDatParser::FindModuleUsingPID");
hgs
parents:
diff changeset
  1435
hgs
parents:
diff changeset
  1436
	int iRet = -1;
hgs
parents:
diff changeset
  1437
hgs
parents:
diff changeset
  1438
	// Change module name characters to lowercase
hgs
parents:
diff changeset
  1439
	for( unsigned int i = 0 ; i < m_vDllLoadModList.size() ; i++ )
hgs
parents:
diff changeset
  1440
	{
hgs
parents:
diff changeset
  1441
		if( m_vDllLoadModList[i].iPID == iPID )
hgs
parents:
diff changeset
  1442
		{
hgs
parents:
diff changeset
  1443
			iRet = i;
hgs
parents:
diff changeset
  1444
			break;
hgs
parents:
diff changeset
  1445
		}	
hgs
parents:
diff changeset
  1446
	}
hgs
parents:
diff changeset
  1447
	return iRet;
hgs
parents:
diff changeset
  1448
}
hgs
parents:
diff changeset
  1449
*/
hgs
parents:
diff changeset
  1450
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1451
// CATDatParser::FindModuleUsingName
hgs
parents:
diff changeset
  1452
// Function finds module using module name.
hgs
parents:
diff changeset
  1453
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1454
int CATDatParser::FindModuleUsingName( const char* pModName )
hgs
parents:
diff changeset
  1455
{
hgs
parents:
diff changeset
  1456
	LOG_LOW_FUNC_ENTRY("CATDatParser::FindModuleUsingName");
hgs
parents:
diff changeset
  1457
hgs
parents:
diff changeset
  1458
	// Mod name empty?
hgs
parents:
diff changeset
  1459
	if( pModName == NULL || *pModName == 0 )
hgs
parents:
diff changeset
  1460
		return -1;
hgs
parents:
diff changeset
  1461
hgs
parents:
diff changeset
  1462
	int iRet = -1;
hgs
parents:
diff changeset
  1463
	string sModName( pModName );
hgs
parents:
diff changeset
  1464
	// Change module name characters to lowercase
hgs
parents:
diff changeset
  1465
	ChangeToLower( sModName );
hgs
parents:
diff changeset
  1466
	// Remove variant marks (dots)
hgs
parents:
diff changeset
  1467
	RemoveAllAfterDotIfTwoDots( sModName);
hgs
parents:
diff changeset
  1468
	for( unsigned int i = 0 ; i < m_vDllLoadModList.size() ; i++ )
hgs
parents:
diff changeset
  1469
	{
hgs
parents:
diff changeset
  1470
		string sTemp( m_vDllLoadModList[i].sModuleName );
hgs
parents:
diff changeset
  1471
		ChangeToLower( sTemp );
hgs
parents:
diff changeset
  1472
		// Remove variant marks (dots)
hgs
parents:
diff changeset
  1473
		RemoveAllAfterDotIfTwoDots( sTemp );
hgs
parents:
diff changeset
  1474
		if( sTemp.find( sModName ) != string::npos )
hgs
parents:
diff changeset
  1475
		{
hgs
parents:
diff changeset
  1476
			iRet = i;
hgs
parents:
diff changeset
  1477
			break;
hgs
parents:
diff changeset
  1478
		}	
hgs
parents:
diff changeset
  1479
	}
hgs
parents:
diff changeset
  1480
	return iRet;
hgs
parents:
diff changeset
  1481
}
hgs
parents:
diff changeset
  1482
hgs
parents:
diff changeset
  1483
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1484
// CATDatParser::SetPrintFlag
hgs
parents:
diff changeset
  1485
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1486
void CATDatParser::SetPringFlag( bool bPrintFlag )
hgs
parents:
diff changeset
  1487
{
hgs
parents:
diff changeset
  1488
	LOG_FUNC_ENTRY("CATDatParser::SetPringFlag");
hgs
parents:
diff changeset
  1489
	m_DataSaver.SetPrintFlag( bPrintFlag );
hgs
parents:
diff changeset
  1490
}
hgs
parents:
diff changeset
  1491
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1492
// CATDatParser::SetOffSet
hgs
parents:
diff changeset
  1493
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1494
void CATDatParser::SetOffSet( int iOffSet )
hgs
parents:
diff changeset
  1495
{
hgs
parents:
diff changeset
  1496
	LOG_FUNC_ENTRY("CATDatParser::SetOffSet");
hgs
parents:
diff changeset
  1497
	m_iOffSet = iOffSet;
hgs
parents:
diff changeset
  1498
}
hgs
parents:
diff changeset
  1499
hgs
parents:
diff changeset
  1500
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1501
// CATDatParser::GetOffSet
hgs
parents:
diff changeset
  1502
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1503
int CATDatParser::GetOffSet( ) const
hgs
parents:
diff changeset
  1504
{
hgs
parents:
diff changeset
  1505
	LOG_LOW_FUNC_ENTRY("CATDatParser::GetOffSet");
hgs
parents:
diff changeset
  1506
	return m_iOffSet;
hgs
parents:
diff changeset
  1507
}
hgs
parents:
diff changeset
  1508
hgs
parents:
diff changeset
  1509
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1510
// Set project platform.
hgs
parents:
diff changeset
  1511
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1512
void CATDatParser::SetProjectPlatform( const string& sPlatform )
hgs
parents:
diff changeset
  1513
{
hgs
parents:
diff changeset
  1514
	LOG_FUNC_ENTRY("CATDatParser::SetProjectPlatform");
hgs
parents:
diff changeset
  1515
	m_sProjectPlatform = sPlatform;
hgs
parents:
diff changeset
  1516
hgs
parents:
diff changeset
  1517
	// Check that platform not empty before determing platform from it.
hgs
parents:
diff changeset
  1518
	if ( sPlatform.empty() )
hgs
parents:
diff changeset
  1519
		return;
hgs
parents:
diff changeset
  1520
hgs
parents:
diff changeset
  1521
	// Set functions offset in mapfiles correct (depending on platform).
hgs
parents:
diff changeset
  1522
	if ( _stricmp( sPlatform.c_str(), "armv5" ) == 0 )
hgs
parents:
diff changeset
  1523
	{
hgs
parents:
diff changeset
  1524
		m_iOffSet = FUNCTIONS_OFFSET_IN_MAP_FILE_ARMV5;
hgs
parents:
diff changeset
  1525
	}
hgs
parents:
diff changeset
  1526
	else if ( _stricmp( sPlatform.c_str(), "winscw" ) == 0 )
hgs
parents:
diff changeset
  1527
	{
hgs
parents:
diff changeset
  1528
		m_iOffSet = FUNCTIONS_OFFSET_IN_MAP_FILE_WINSCW;
hgs
parents:
diff changeset
  1529
	}
hgs
parents:
diff changeset
  1530
	else if ( _stricmp( sPlatform.c_str(), "gcce" ) == 0 )
hgs
parents:
diff changeset
  1531
	{
hgs
parents:
diff changeset
  1532
		m_iOffSet = FUNCTIONS_OFFSET_IN_GCCE;
hgs
parents:
diff changeset
  1533
	}
hgs
parents:
diff changeset
  1534
	else
hgs
parents:
diff changeset
  1535
	{
hgs
parents:
diff changeset
  1536
		LOG_STRING( AT_MSG << "Error, cannot set function's offset in map file, invalid platform: " << sPlatform );
hgs
parents:
diff changeset
  1537
	}
hgs
parents:
diff changeset
  1538
}
hgs
parents:
diff changeset
  1539
hgs
parents:
diff changeset
  1540
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1541
// Set projects build type. Use enumeration defined in CATProject.
hgs
parents:
diff changeset
  1542
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1543
void CATDatParser::SetProjectBuildType( int eBuildType )
hgs
parents:
diff changeset
  1544
{
hgs
parents:
diff changeset
  1545
	LOG_FUNC_ENTRY("CATDatParser::SetProjectBuildType");
hgs
parents:
diff changeset
  1546
	m_eProjectBuildType = eBuildType;
hgs
parents:
diff changeset
  1547
}
hgs
parents:
diff changeset
  1548
hgs
parents:
diff changeset
  1549
//EOF