1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 03:28:20 +02:00
Beef/IDEHelper/Debugger.h

398 lines
12 KiB
C
Raw Permalink Normal View History

2019-08-23 11:56:54 -07:00
#pragma once
#include "DebugCommon.h"
#include "Compiler/MemReporter.h"
#include "BeefySysLib/util/HashSet.h"
#include <vector>
NS_BF_BEGIN
class DebugManager;
class BfAutoComplete;
enum DbgHitCountBreakKind : int8
{
DbgHitCountBreakKind_None,
DbgHitCountBreakKind_Equals,
DbgHitCountBreakKind_GreaterEquals,
DbgHitCountBreakKind_Multiple
};
class Breakpoint
{
public:
String mFilePath;
int mRequestedLineNum;
int mLineNum;
int mColumn;
int mInstrOffset;
int mPendingHotBindIdx;
int mHitCount;
int mTargetHitCount;
2022-07-26 13:27:03 -04:00
DbgHitCountBreakKind mHitCountBreakKind;
2019-08-23 11:56:54 -07:00
String mLogging;
bool mBreakAfterLogging;
intptr mThreadId;
String mSymbolName;
Breakpoint* mHead;
Breakpoint* mLinkedSibling; // For things like templates with multiple imps on same source line
bool mIsLinkedSibling; // Not in breakpoint list
2022-07-26 13:27:03 -04:00
public:
2019-08-23 11:56:54 -07:00
Breakpoint()
{
mRequestedLineNum = -1;
mLineNum = -1;
mColumn = -1;
mInstrOffset = 0;
mPendingHotBindIdx = -1;
mHitCount = 0;
mTargetHitCount = 0;
2022-07-26 13:27:03 -04:00
mHitCountBreakKind = DbgHitCountBreakKind_None;
2019-08-23 11:56:54 -07:00
mThreadId = -1;
mHead = NULL;
mLinkedSibling = NULL;
2022-07-26 13:27:03 -04:00
mIsLinkedSibling = false;
2019-08-23 11:56:54 -07:00
mBreakAfterLogging = false;
}
virtual uintptr GetAddr() = 0;
virtual bool IsMemoryBreakpointBound() = 0;
};
2022-03-08 06:27:06 -08:00
enum DbgTypeKindFlags
{
DbgTypeKindFlag_None = 0,
DbgTypeKindFlag_Int = 1
};
2019-08-23 11:56:54 -07:00
enum DwDisplayType : int8
{
DwDisplayType_NotSpecified,
DwDisplayType_Decimal,
DwDisplayType_HexLower,
DwDisplayType_HexUpper,
DwDisplayType_Char,
DwDisplayType_Ascii,
DwDisplayType_Utf8,
DwDisplayType_Utf16,
DwDisplayType_Utf32,
};
enum DwIntDisplayType : int8
{
DwIntDisplayType_Default,
DwIntDisplayType_Decimal,
DwIntDisplayType_HexadecimalUpper,
DwIntDisplayType_Binary,
DwIntDisplayType_Octal,
DwIntDisplayType_HexadecimalLower,
};
2020-06-19 06:42:52 -07:00
enum DwFloatDisplayType : int8
{
DwFloatDisplayType_Default,
DwFloatDisplayType_Minimal,
2022-07-26 13:27:03 -04:00
DwFloatDisplayType_Full,
2020-06-19 06:42:52 -07:00
DwFloatDisplayType_HexUpper,
DwFloatDisplayType_HexLower,
};
2019-08-23 11:56:54 -07:00
enum DwMmDisplayType : int8
{
DwMmDisplayType_Default,
2022-01-07 10:31:26 -05:00
DwMmDisplayType_UInt8,
DwMmDisplayType_Int16,
DwMmDisplayType_Int32,
DwMmDisplayType_Int64,
2019-08-23 11:56:54 -07:00
DwMmDisplayType_Float,
DwMmDisplayType_Double
};
enum DwEvalExpressionFlags : int16
{
DwEvalExpressionFlag_None = 0,
DwEvalExpressionFlag_FullPrecision = 0x01,
DwEvalExpressionFlag_ValidateOnly = 0x02,
DwEvalExpressionFlag_DeselectCallStackIdx = 0x04,
DwEvalExpressionFlag_AllowSideEffects = 0x08,
DwEvalExpressionFlag_AllowCalls = 0x10,
2020-06-15 09:01:49 -07:00
DwEvalExpressionFlag_AllowPropertyEval = 0x20,
DwEvalExpressionFlag_MemoryAddress = 0x40,
DwEvalExpressionFlag_MemoryWatch = 0x80,
DwEvalExpressionFlag_Symbol = 0x100,
2022-07-26 13:27:03 -04:00
DwEvalExpressionFlag_StepIntoCalls = 0x200,
DwEvalExpressionFlag_RawStr = 0x400,
DwEvalExpressionFlag_AllowStringView = 0x800
2019-08-23 11:56:54 -07:00
};
struct DwDisplayInfo
{
String mFormatStr;
2019-08-23 11:56:54 -07:00
DwIntDisplayType mIntDisplayType;
DwMmDisplayType mMmDisplayType;
2020-06-19 06:42:52 -07:00
DwFloatDisplayType mFloatDisplayType;
2019-08-23 11:56:54 -07:00
DwDisplayInfo()
{
mIntDisplayType = DwIntDisplayType_Default;
mMmDisplayType = DwMmDisplayType_Default;
2020-06-19 06:42:52 -07:00
mFloatDisplayType = DwFloatDisplayType_Default;
2019-08-23 11:56:54 -07:00
}
};
enum RunState
{
2022-07-26 13:27:03 -04:00
RunState_NotStarted,
2019-08-23 11:56:54 -07:00
RunState_Running,
RunState_Running_ToTempBreakpoint,
RunState_Paused,
RunState_Breakpoint,
RunState_DebugEval,
RunState_DebugEval_Done,
RunState_HotStep,
RunState_Exception,
RunState_Terminating,
2022-07-26 13:27:03 -04:00
RunState_Terminated,
2019-08-23 11:56:54 -07:00
RunState_SearchingSymSrv,
RunState_HotResolve,
RunState_TargetUnloaded
2019-08-23 11:56:54 -07:00
};
enum DebuggerResult
{
DebuggerResult_Ok,
DebuggerResult_UnknownError,
DebuggerResult_CannotOpen,
DebuggerResult_WrongBitSize,
};
enum BfDbgAttachFlags : uint8
{
BfDbgAttachFlag_None = 0,
BfDbgAttachFlag_ShutdownOnExit = 1
};
enum BfSymSrvFlags : uint8
{
BfSymSrvFlag_None = 0,
BfSymSrvFlag_Disable = 1,
BfSymSrvFlag_TempCache = 2, // For testing - set up clean temporary cache
};
enum DbgHotResolveFlags : uint8
{
DbgHotResolveFlag_None = 0,
DbgHotResolveFlag_ActiveMethods = 1,
DbgHotResolveFlag_Allocations = 2,
DbgHotResolveFlag_KeepThreadState = 4
2019-08-23 11:56:54 -07:00
};
enum DbgMemoryFlags : uint8
{
DbgMemoryFlags_None = 0,
DbgMemoryFlags_Read = 1,
DbgMemoryFlags_Write = 2,
DbgMemoryFlags_Execute = 4
};
2024-07-23 07:56:23 +02:00
enum DbgOpenFileFlags : uint8
{
DbgOpenFileFlag_None = 0,
DbgOpenFileFlag_RedirectStdInput = 1,
DbgOpenFileFlag_RedirectStdOutput = 2,
DbgOpenFileFlag_RedirectStdError = 4
};
2019-08-23 11:56:54 -07:00
class DbgModuleMemoryCache
{
public:
2022-07-26 13:27:03 -04:00
public:
2019-08-23 11:56:54 -07:00
uintptr mAddr;
int mSize;
int mBlockSize;
uint8** mBlocks;
DbgMemoryFlags* mFlags;
int mBlockCount;
2022-07-26 13:27:03 -04:00
bool mOwns;
2019-08-23 11:56:54 -07:00
public:
DbgModuleMemoryCache(uintptr addr, int size);
//DbgModuleMemoryCache(uintptr addr, uint8* data, int size, bool makeCopy);
2019-08-23 11:56:54 -07:00
~DbgModuleMemoryCache();
DbgMemoryFlags Read(uintptr addr, uint8* data, int size);
void ReportMemory(MemReporter* memReporter);
};
class DbgHotResolveData
{
public:
2020-07-31 06:16:29 -07:00
struct TypeData
{
intptr mCount;
2022-07-26 13:27:03 -04:00
intptr mSize;
2020-07-31 06:16:29 -07:00
TypeData()
{
mCount = 0;
mSize = 0;
}
};
public:
Array<TypeData> mTypeData;
2019-08-23 11:56:54 -07:00
Beefy::HashSet<String> mBeefCallStackEntries;
};
class Profiler;
class Debugger
{
public:
DebugManager* mDebugManager;
2022-07-26 13:27:03 -04:00
RunState mRunState;
2019-08-23 11:56:54 -07:00
DbgHotResolveData* mHotResolveData;
bool mHadImageFindError;
public:
Debugger()
{
mDebugManager = NULL;
2022-07-26 13:27:03 -04:00
mRunState = RunState_NotStarted;
2019-08-23 11:56:54 -07:00
mHotResolveData = NULL;
mHadImageFindError = false;
}
virtual ~Debugger() { delete mHotResolveData; }
virtual void OutputMessage(const StringImpl& msg) = 0;
virtual void OutputRawMessage(const StringImpl& msg) = 0;
virtual int GetAddrSize() = 0;
virtual bool CanOpen(const StringImpl& fileName, DebuggerResult* outResult) = 0;
2024-07-23 07:56:23 +02:00
virtual void OpenFile(const StringImpl& launchPath, const StringImpl& targetPath, const StringImpl& args, const StringImpl& workingDir, const Array<uint8>& envBlock, bool hotSwapEnabled, DbgOpenFileFlags openFileFlags) = 0;
2019-08-23 11:56:54 -07:00
virtual bool Attach(int processId, BfDbgAttachFlags attachFlags) = 0;
2024-07-23 07:56:23 +02:00
virtual void GetStdHandles(BfpFile** outStdIn, BfpFile** outStdOut, BfpFile** outStdErr) = 0;
2019-08-23 11:56:54 -07:00
virtual void Run() = 0;
virtual bool HasLoadedTargetBinary() { return true; }
2019-08-23 11:56:54 -07:00
virtual void HotLoad(const Array<String>& objectFiles, int hotIdx) = 0;
virtual void InitiateHotResolve(DbgHotResolveFlags flags) = 0;
2020-07-31 06:16:29 -07:00
virtual intptr GetDbgAllocHeapSize() = 0;
virtual String GetDbgAllocInfo() = 0;
2019-08-23 11:56:54 -07:00
virtual void Update() = 0;
virtual void ContinueDebugEvent() = 0;
virtual void ForegroundTarget(int altProcessId) = 0;
2019-08-23 11:56:54 -07:00
virtual Breakpoint* CreateBreakpoint(const StringImpl& fileName, int lineNum, int wantColumn, int instrOffset) = 0;
virtual Breakpoint* CreateMemoryBreakpoint(intptr addr, int byteCount) = 0;
virtual Breakpoint* CreateSymbolBreakpoint(const StringImpl& symbolName) = 0;
virtual Breakpoint* CreateAddressBreakpoint(intptr address) = 0;
virtual void CheckBreakpoint(Breakpoint* breakpoint) = 0;
virtual void HotBindBreakpoint(Breakpoint* wdBreakpoint, int lineNum, int hotIdx) = 0;
2022-07-26 13:27:03 -04:00
virtual void DeleteBreakpoint(Breakpoint* wdBreakpoint) = 0;
2019-08-23 11:56:54 -07:00
virtual void DetachBreakpoint(Breakpoint* wdBreakpoint) = 0;
virtual void MoveBreakpoint(Breakpoint* wdBreakpoint, int lineNum, int wantColumn, bool rebindNow) = 0;
virtual void MoveMemoryBreakpoint(Breakpoint* wdBreakpoint, intptr addr, int byteCount) = 0;
virtual void DisableBreakpoint(Breakpoint* wdBreakpoint) = 0;
virtual void SetBreakpointCondition(Breakpoint* wdBreakpoint, const StringImpl& condition) = 0;
virtual void SetBreakpointLogging(Breakpoint* wdBreakpoint, const StringImpl& logging, bool breakAfterLogging) = 0;
virtual Breakpoint* FindBreakpointAt(intptr address) = 0;
virtual Breakpoint* GetActiveBreakpoint() = 0;
2022-03-08 06:27:06 -08:00
virtual uintptr GetBreakpointAddr(Breakpoint* breakpoint) { return breakpoint->GetAddr(); }
2019-08-23 11:56:54 -07:00
virtual void BreakAll() = 0;
virtual bool TryRunContinue() = 0;
virtual void StepInto(bool inAssembly) = 0;
virtual void StepIntoSpecific(intptr addr) = 0;
virtual void StepOver(bool inAssembly) = 0;
virtual void StepOut(bool inAssembly) = 0;
virtual void SetNextStatement(bool inAssembly, const StringImpl& fileName, int64 lineNumOrAsmAddr, int wantColumn) = 0;
//virtual DbgTypedValue GetRegister(const StringImpl& regName, CPURegisters* registers, Array<RegForm>* regForms = NULL) = 0;
virtual String Evaluate(const StringImpl& expr, int callStackIdx, int cursorPos, int language, DwEvalExpressionFlags expressionFlags) = 0;
virtual String EvaluateContinue() = 0;
virtual void EvaluateContinueKeep() = 0;
virtual String EvaluateToAddress(const StringImpl& expr, int callStackIdx, int cursorPos) = 0;
virtual String EvaluateAtAddress(const StringImpl& expr, intptr atAddr, int cursorPos) = 0;
2022-07-26 13:27:03 -04:00
virtual String GetCollectionContinuation(const StringImpl& continuationData, int callStackIdx, int count) = 0;
2019-08-23 11:56:54 -07:00
virtual String GetAutoExpressions(int callStackIdx, uint64 memoryRangeStart, uint64 memoryRangeLen) = 0;
virtual String GetAutoLocals(int callStackIdx, bool showRegs) = 0;
virtual String CompactChildExpression(const StringImpl& expr, const StringImpl& parentExpr, int callStackIdx) = 0;
2020-07-18 06:50:28 -07:00
virtual String GetProcessInfo() = 0;
virtual int GetProcessId() = 0;
2019-08-23 11:56:54 -07:00
virtual String GetThreadInfo() = 0;
2022-07-26 13:27:03 -04:00
virtual void SetActiveThread(int threadId) = 0;
2019-08-23 11:56:54 -07:00
virtual int GetActiveThread() = 0;
virtual void FreezeThread(int threadId) = 0;
virtual void ThawThread(int threadId) = 0;
virtual bool IsActiveThreadWaiting() = 0;
virtual void ClearCallStack() = 0;
virtual void UpdateCallStack(bool slowEarlyOut = true) = 0;
virtual int GetCallStackCount() = 0;
virtual int GetRequestedStackFrameIdx() = 0;
2022-07-26 13:27:03 -04:00
virtual int GetBreakStackFrameIdx() = 0;
2019-08-23 11:56:54 -07:00
virtual bool ReadMemory(intptr address, uint64 length, void* dest, bool local = false) = 0;
virtual bool WriteMemory(intptr address, void* src, uint64 length) = 0;
virtual DbgMemoryFlags GetMemoryFlags(intptr address) = 0;
2022-07-26 13:27:03 -04:00
virtual void UpdateRegisterUsage(int stackFrameIdx) = 0;
virtual void UpdateCallStackMethod(int stackFrameIdx) = 0;
virtual void GetCodeAddrInfo(intptr addr, intptr inlineCallAddr, String* outFile, int* outHotIdx, int* outDefLineStart, int* outDefLineEnd, int* outLine, int* outColumn) = 0;
2019-08-23 11:56:54 -07:00
virtual void GetStackAllocInfo(intptr addr, int* outThreadId, int* outStackIdx) = 0;
virtual String GetStackFrameInfo(int stackFrameIdx, intptr* addr, String* outFile, int32* outHotIdx, int32* outDefLineStart, int32* outDefLineEnd, int32* outLine, int32* outColumn, int32* outLanguage, int32* outStackSize, int8* outFlags) = 0;
virtual String GetStackFrameId(int stackFrameIdx) { return ""; }
2019-08-23 11:56:54 -07:00
virtual String Callstack_GetStackFrameOldFileInfo(int stackFrameIdx) = 0;
virtual int GetJmpState(int stackFrameIdx) = 0;
virtual intptr GetStackFrameCalleeAddr(int stackFrameIdx) = 0;
virtual String GetStackMethodOwner(int stackFrameIdx, int& language) = 0;
virtual String FindCodeAddresses(const StringImpl& fileName, int line, int column, bool allowAutoResolve) = 0;
virtual String GetAddressSourceLocation(intptr address) = 0;
virtual String GetAddressSymbolName(intptr address, bool demangle) = 0;
virtual String DisassembleAtRaw(intptr address) = 0;
virtual String DisassembleAt(intptr address) = 0;
2022-07-26 13:27:03 -04:00
virtual String FindLineCallAddresses(intptr address) = 0;
virtual String GetCurrentException() = 0;
2019-08-23 11:56:54 -07:00
virtual String GetModulesInfo() = 0;
virtual String GetModuleInfo(const StringImpl& moduleName) { return ""; }
2019-08-23 11:56:54 -07:00
virtual void SetAliasPath(const StringImpl& origPath, const StringImpl& localPath) = 0;
virtual void CancelSymSrv() = 0;
virtual bool HasPendingDebugLoads() = 0;
virtual int LoadImageForModule(const StringImpl& moduleName, const StringImpl& debugFileName) = 0;
2019-08-23 11:56:54 -07:00
virtual int LoadDebugInfoForModule(const StringImpl& moduleName) = 0;
virtual int LoadDebugInfoForModule(const StringImpl& moduleName, const StringImpl& debugFileName) = 0;
virtual void StopDebugging() = 0;
virtual void Terminate() = 0;
2022-07-26 13:27:03 -04:00
virtual void Detach() = 0;
2019-08-23 11:56:54 -07:00
virtual Profiler* StartProfiling() = 0;
virtual Profiler* PopProfiler() = 0; // Profiler requested by target program
virtual void ReportMemory(MemReporter* memReporter) = 0;
virtual bool IsOnDemandDebugger() = 0;
virtual bool GetEmitSource(const StringImpl& filePath, String& outText) = 0;
2019-08-23 11:56:54 -07:00
};
class Profiler
{
public:
String mDescription;
int mSamplesPerSecond;
intptr mTargetThreadId;
public:
Profiler()
{
mSamplesPerSecond = -1;
mTargetThreadId = 0;
}
virtual ~Profiler() {}
virtual void Start() = 0;
virtual void Stop() = 0;
virtual void Clear() = 0;
virtual bool IsSampling() = 0;
virtual String GetOverview() = 0;
virtual String GetThreadList() = 0;
2022-07-26 13:27:03 -04:00
virtual String GetCallTree(int threadId, bool reverse) = 0;
2019-08-23 11:56:54 -07:00
};
NS_BF_END