analyzetool/commandlineengine/src/CATParseBinaryFile.cpp
branchRCL_3
changeset 49 7fdc9a71d314
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/analyzetool/commandlineengine/src/CATParseBinaryFile.cpp	Wed Sep 15 13:53:27 2010 +0300
@@ -0,0 +1,734 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Definitions for the class CATParseTraceFile.
+*
+*/
+
+
+#include "../inc/ATCommonDefines.h"
+#include "../inc/CATParseBinaryFile.h"
+#include "../inc/catdatasaver.h"
+#include "../inc/CATDatParser.h"
+#include "../inc/CATProcessData.h"
+
+#include <time.h>
+
+
+
+// -----------------------------------------------------------------------------
+// CATParseBinaryFile::CATParseTraceFile
+// Constructor.
+// -----------------------------------------------------------------------------
+CATParseBinaryFile::CATParseBinaryFile()
+{
+	LOG_FUNC_ENTRY("CATParseTraceFile::CATParseTraceFile");
+	m_DataSaver.SetPrintFlag( false );
+}
+
+// -----------------------------------------------------------------------------
+// CATParseBinaryFile::StartParse
+// Main function to start trace parsing.
+// -----------------------------------------------------------------------------
+bool CATParseBinaryFile::StartParse( const char* pFileName, const char* pOutputFileName )
+{
+	LOG_FUNC_ENTRY("CATParseTraceFile::StartParse");
+
+	// Return value, will be changed to true if process start found.
+	bool bRet = false;
+
+	// Check pointers
+	if ( pFileName == NULL  )
+		return bRet;
+
+
+	if ( ! FileExists( pFileName ) )
+	{
+		cout << AT_MSG << "Error, input file \""
+			<< pFileName
+			<< "\" does not exist." << endl;
+		return bRet;
+	}
+
+	// Open input and output file
+	ifstream in( pFileName, ios::binary );
+	ofstream sDataToParse( pOutputFileName );
+
+	// Check file opened ok
+	if ( !in.good() )
+		return false;
+
+	// Get stream size
+	size_t streamPos = in.tellg();
+	in.seekg( 0, ios::end);
+	size_t streamEnd = in.tellg();
+	in.seekg( 0, ios::beg );
+
+	//Origianl characters (not filtered).
+
+	unsigned char cDataFromFile[MAX_LINE_LENGTH];
+
+	bool bProcessEndReached = false;
+	bool bError = false;
+
+	char messageType = 0;
+	unsigned __int64 messageTime = 0;
+
+	unsigned long iProcessId(0);
+	int iAddressCount(0);
+	string sTemp;
+
+	//first parse version info
+	GetString( cDataFromFile, in, streamPos, streamEnd );
+	//todo check if version is correct	
+
+	while( !bError && !bProcessEndReached )
+	{
+		// get time
+		if( !GetNum64( cDataFromFile, in, streamPos, streamEnd ) )
+		{
+			bError = true;
+			break;
+		}
+		messageTime = StringToNum64( cDataFromFile );
+
+		// get message type
+		if( !GetNum8( cDataFromFile, in, streamPos, streamEnd ) )
+		{
+			bError = true;
+			break;
+		}
+		messageType = (int)cDataFromFile[0];
+
+		switch (messageType)
+		{
+			case EProcessStart:
+				{
+				//temp string to store data until we get to processID
+				sTemp.clear();
+
+                //PCS MemoryLeaker.exe[edf5a8b2]0001 17b 48939b0f5c04f 1 3 1.10.0 1.7.5
+				sTemp.append( LABEL_PROCESS_START );
+				sTemp.append( " " );
+
+				// get process name
+				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+
+				sTemp.append( (char *)cDataFromFile );
+				sTemp.append( " " );
+
+				//get process id
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+			    {
+					bError = true;
+					break;
+				}
+				iProcessId = StringToNum32(cDataFromFile);
+
+				// write stored data
+				sDataToParse << std::hex << messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+				sDataToParse << std::hex << iProcessId;
+				sDataToParse << " ";
+				sDataToParse << sTemp;
+				sDataToParse <<  std::hex << iProcessId;
+				sDataToParse << " ";
+
+				//write time
+				sDataToParse <<  std::hex << messageTime;
+				sDataToParse << " ";
+
+				//get udeb/urel
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::dec << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				//add trace version - TODO check
+				sDataToParse <<  std::dec << 3;
+				sDataToParse << " ";
+
+				// get atool version
+				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse << (char *)cDataFromFile;
+				sDataToParse << " ";
+
+				// get api version
+				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse << (char *)cDataFromFile;
+				sDataToParse << "\n";
+
+				//process start found
+				bRet = true;
+
+				}
+				break;
+
+			case EProcessEnd:
+				{
+				sDataToParse << messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+				sDataToParse << iProcessId;
+				sDataToParse << " ";
+				//PCE
+				sDataToParse << LABEL_PROCESS_END ;
+				sDataToParse << "\n";
+				bProcessEndReached = true;
+				}
+				break;
+
+			case EDllLoad:
+				{
+				sDataToParse << std::hex << messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+				sDataToParse << iProcessId;
+				sDataToParse << " ";
+				//DLL AToolMemoryLeakerDll3.dll 3ff80000 3ff92000
+				sDataToParse << LABEL_DLL_LOAD ;
+				sDataToParse << " ";
+
+				// get dll name
+				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse << (char *)cDataFromFile;
+				sDataToParse << " ";
+
+				// get start address
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get end address
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << "\n";
+				}
+				break;
+			
+			case EDllUnload:
+				{
+				sDataToParse << messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+				sDataToParse << iProcessId;
+				sDataToParse << " ";
+				//DLU AToolMemoryLeakerDll3.dll 3ff80000 3ff92000
+				sDataToParse << LABEL_DLL_UNLOAD ;
+				sDataToParse << " ";
+
+				// get dll name
+				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse << (char *)cDataFromFile;
+				sDataToParse << " ";
+
+				// get start address
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get end address
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << "\n";
+				}
+				break;
+
+			case EAllocH:
+				{
+				sDataToParse << messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+				sDataToParse << iProcessId;
+				sDataToParse << " ";
+				//ALH 5a7a6734 5c 17c 11 6003ded4 60010df2 40001bff 40001c39 ...
+				// no fragments in log file
+				sDataToParse << ALLOCH_ID ;
+				sDataToParse << " ";
+
+				// get mam address
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get size of allocation
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get thread id
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get address count
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				int iAddressCount = StringToNum32(cDataFromFile);
+				sDataToParse <<  std::hex << iAddressCount;
+
+				// get callstack
+				for(int i=0; i<iAddressCount; i++)
+				{
+					sDataToParse << " ";
+					if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+					{
+						bError = true;
+						break;
+					}
+				    sDataToParse <<  std::hex << StringToNum32(cDataFromFile); 
+				}
+				sDataToParse << "\n";
+				}
+				break;
+
+			case EFreeH:
+				{
+				sDataToParse << std::hex <<messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+				sDataToParse << iProcessId;
+				sDataToParse << " ";
+				//FRH 5a7a679c 17c 0 (6003ded4 60010df2 40001bff 40001c39 ...)
+				// no fragments in log file
+				sDataToParse << FREEH_ID ;
+				sDataToParse << " ";
+
+				// get mem address
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get thread id
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get address count
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				iAddressCount = StringToNum32(cDataFromFile);
+				sDataToParse <<  std::hex << iAddressCount;
+
+				// get callstack
+				for(int i=0; i<iAddressCount; i++)
+				{
+					sDataToParse << " ";
+					if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+					{
+						bError = true;
+						break;
+					}
+				    sDataToParse <<  std::hex << StringToNum32(cDataFromFile); 
+				}
+				sDataToParse << "\n";
+
+				break;
+
+			case EReallocH:
+				sDataToParse << std::hex << messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+				sDataToParse << iProcessId;
+				sDataToParse << " ";
+				// RAH 0 5a7a6f30 30 17c 17 6003e02b 60010ef8 600083e5 ...
+				// no fragments in log file
+				sDataToParse << REALLOCH_ID ;
+				sDataToParse << " ";
+
+				// get freed mem address
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get allocated mem address
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get size of allocation
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get thread id
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << " ";
+
+				// get address count
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				iAddressCount = StringToNum32(cDataFromFile);
+				sDataToParse <<  std::hex << iAddressCount;
+
+				// get callstack
+				for(int i=0; i<iAddressCount; i++)
+				{
+					sDataToParse << " ";
+					if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+					{
+						bError = true;
+						break;
+					}
+				    sDataToParse <<  std::hex << StringToNum32(cDataFromFile); 
+				}
+				sDataToParse << "\n";
+				}
+				break;
+
+			case EHandleLeak:
+				{
+				sDataToParse << std::hex << messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+				sDataToParse << iProcessId;
+				sDataToParse << " ";
+				//HDL handleLeakCount
+				sDataToParse << LABEL_HANDLE_LEAK ;
+				sDataToParse << " ";
+
+				//get handle leak count
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << "\n";
+				}
+				break;
+
+			case EThreadStart:
+				{
+				sDataToParse << std::hex << messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+				sDataToParse << iProcessId;
+				sDataToParse << " ";
+				// TDS 17c
+				sDataToParse << LABEL_THREAD_START;
+				sDataToParse << " ";
+
+				// get thread ID
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << "\n";
+				}
+				break;
+
+			case EThreadEnd:
+				{
+				sDataToParse << std::hex << messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+				sDataToParse << iProcessId;
+				sDataToParse << " ";
+				// TDE 17c
+				sDataToParse << LABEL_THREAD_END;
+				sDataToParse << " ";
+
+				// get thread ID
+				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
+				sDataToParse << "\n";
+				}
+				break;
+
+			case EDeviceInfo:
+				{
+				// DEVINFO swVersion  romChecksum //both are descriptors
+				sDataToParse << std::hex << messageTime;
+				sDataToParse << " ";
+				sDataToParse << MAIN_ID;
+				sDataToParse << " ";
+
+				sDataToParse << LABEL_DEVICE_INFO;
+				sDataToParse << " ";
+
+				// get swVersion
+				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}			
+				sDataToParse << (char *)cDataFromFile;
+				sDataToParse << " ";
+
+				// todo check
+				// get romChecksum
+				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
+				{
+					bError = true;
+					break;
+				}
+				
+				sDataToParse << (char *)cDataFromFile;
+				sDataToParse << "\n";
+				}
+				break;
+
+			case EError:
+				//currently not used
+				break;
+			case ETestStart:
+			case ETestEnd:
+				// currently can not occure in bin log file, this is added from carbide in traces
+				break;
+			default:
+				bError = true;
+				break;				
+		}
+	}
+
+	// Close file.
+	in.close();
+
+	sDataToParse.close();
+	return !bError;
+}
+
+// -----------------------------------------------------------------------------
+// CATParseBinaryFile::GetDataSaver
+// Gets data saver object.
+// -----------------------------------------------------------------------------
+CATDataSaver* CATParseBinaryFile::GetDataSaver(void)	
+{
+	LOG_LOW_FUNC_ENTRY("CATParseTraceFile::GetDataSaver");
+	return &m_DataSaver;
+}
+
+// -----------------------------------------------------------------------------
+// CATParseBinaryFile::StringToNum64
+// Gets 64bit number from input string
+// -----------------------------------------------------------------------------
+unsigned __int64 CATParseBinaryFile::StringToNum64( unsigned char* cVal )
+{
+	unsigned __int64 iRetVal(0);
+
+	for(int i=7; i>=0; i--)
+		iRetVal = ( iRetVal << 8 ) + cVal[i];
+
+	return iRetVal;
+}
+
+// -----------------------------------------------------------------------------
+// CATParseBinaryFile::StringToNum32
+// Gets 32bit number from input string
+// -----------------------------------------------------------------------------
+unsigned long CATParseBinaryFile::StringToNum32( unsigned char* cVal )
+{
+	unsigned long iRetVal(0);
+
+	for(int i=4; i>=0; i--)
+		iRetVal = ( iRetVal << 8 ) + cVal[i];
+
+	return iRetVal;
+}
+
+// -----------------------------------------------------------------------------
+// CATParseBinaryFile::GetString
+// Get next string from file
+// -----------------------------------------------------------------------------
+bool CATParseBinaryFile::GetString( unsigned char* pData, ifstream &pIn, size_t &pStreamPos, size_t pStreamEnd )
+{
+	int	numOfRead = 1;
+	if(pStreamPos + numOfRead <= pStreamEnd)
+	{
+		pIn.read((char*)pData, numOfRead);
+		pStreamPos = pIn.tellg();
+	}
+	else
+	{
+		return false;
+	}
+
+	numOfRead = (int)pData[0] >> 2;
+	if(pStreamPos + numOfRead <= pStreamEnd)
+	{
+		pIn.read((char*)pData, numOfRead);
+		pStreamPos = pIn.tellg();
+		pData[numOfRead] = 0;
+	}
+	else
+	{
+		return false;
+	}
+
+	return true;
+}
+
+// -----------------------------------------------------------------------------
+// CATParseBinaryFile::GetNum8
+// Get next 8bit number from file
+// -----------------------------------------------------------------------------
+bool CATParseBinaryFile::GetNum8( unsigned char* pData, ifstream &pIn, size_t &pStreamPos, size_t pStreamEnd )
+{
+	int	numOfRead = 1;
+	if(pStreamPos + numOfRead <= pStreamEnd)
+	{
+		pIn.read((char*)pData, numOfRead);
+		pStreamPos = pIn.tellg();
+	}
+	else
+	{
+		return false;
+	}
+
+	return true;
+}
+
+// -----------------------------------------------------------------------------
+// CATParseBinaryFile::GetNum32
+// Get next 32bit number from file
+// -----------------------------------------------------------------------------
+bool CATParseBinaryFile::GetNum32( unsigned char* pData, ifstream &pIn, size_t &pStreamPos, size_t pStreamEnd )
+{
+	int	numOfRead = 4;
+	if(pStreamPos + numOfRead <= pStreamEnd)
+	{
+		pIn.read((char*)pData, numOfRead);
+		pStreamPos = pIn.tellg();
+	}
+	else
+	{
+		return false;
+	}
+
+	return true;
+}
+
+// -----------------------------------------------------------------------------
+// CATParseBinaryFile::GetNum64
+// Get next 64bit number from file
+// -----------------------------------------------------------------------------
+bool CATParseBinaryFile::GetNum64( unsigned char* pData, ifstream &pIn, size_t &pStreamPos, size_t pStreamEnd )
+{
+	int	numOfRead = 8;
+	if(pStreamPos + numOfRead <= pStreamEnd)
+	{
+		pIn.read((char*)pData, numOfRead);
+		pStreamPos = pIn.tellg();
+	}
+	else
+	{
+		return false;
+	}
+
+	return true;
+}
+
+//EOF