// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "HAL/Platform.h" #include "HAL/Runnable.h" #include "Containers/Queue.h" #include "Async/MappedFileHandle.h" #include "Async/TaskGraphInterfaces.h" #include "Common/PagedArray.h" #include "HAL/CriticalSection.h" #include "HAL/Platform.h" #include "TraceServices/Model/AnalysisSession.h" #include "TraceServices/Model/Modules.h" namespace TraceServices { //////////////////////////////////////////////////////////////////////////////// class FPsymResolver : public FRunnable { public: typedef TArray> SymbolArray; void Start(); FPsymResolver(IAnalysisSession& InSession, IResolvedSymbolFilter& InSymbolFilter); ~FPsymResolver(); void QueueModuleLoad(const uint8* ImageId, uint32 ImageIdSize, FModule* Module); void QueueModuleReload(const FModule* Module, const TCHAR* Path, TFunction ResolveOnSuccess); void QueueSymbolResolve(uint64 Address, FResolvedSymbol* Symbol); void OnAnalysisComplete(); void GetStats(IModuleProvider::FStats* OutStats) const; void EnumerateSymbolSearchPaths(TFunctionRef Callback) const; private: struct FModuleEntry { uint64 Base; uint32 Size; const TCHAR* Name; const TCHAR* Path; FModule* Module; TArray ImageId; }; struct FQueuedAddress { uint64 Address; FResolvedSymbol* Target; }; struct FQueuedModule { const FModule* Module; const TCHAR* Path; TArrayView ImageId; }; enum : uint32 { MaxNameLen = 512, }; virtual uint32 Run() override; virtual void Stop() override; static void UpdateResolvedSymbol(FResolvedSymbol& Symbol, ESymbolQueryResult Result, const TCHAR* Module, const TCHAR* Name, const TCHAR* File, uint16 Line); void ResolveSymbol(uint64 Address, FResolvedSymbol& Target); void LoadModuleSymbols(const FModule* Module, const TCHAR* Path, const TArrayView ImageId); const FModuleEntry* GetModuleForAddress(uint64 Address) const; mutable FCriticalSection ModulesCs; TArray LoadedModules; TQueue LoadSymbolsQueue; TQueue ResolveQueue; std::atomic ModulesDiscovered; std::atomic ModulesFailed; std::atomic ModulesLoaded; mutable FCriticalSection SymbolSearchPathsLock; TArray SymbolSearchPaths; bool bRunWorkerThread; bool bDrainThenStop; UPTRINT Handle; IAnalysisSession& Session; IResolvedSymbolFilter& SymbolFilter; FRunnableThread* Thread; struct FPsymSymbol { uint64 Address; uint32 Size; const TCHAR* Name; FPsymSymbol(uint64 InAddress, uint32 InSize, const TCHAR* InName) : Address(InAddress) , Size(InSize) , Name(InName) {} }; struct FPsymLine { uint64 Address; uint32 Size; int32 LineNumber; int32 FileIndex; FPsymLine(uint64 InAddress, uint32 InSize, int32 InLineNumber, int32 InFileIndex) : Address(InAddress) , Size(InSize) , LineNumber(InLineNumber) , FileIndex(InFileIndex) {} }; TMap PsymSourceFiles; TArray PsymSymbols; TArray PsymSourceLines; }; ///////////////////////////////////////////////////////////////////// } // namespace TraceServices