1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00
Beef/IDEHelper/DebugTarget.h
Brian Fiete b63a243fd7 Working on installer, fixing more Win32 issues
Throwing error on member references with ".." cascade token outside invocations (ie: "ts..mA = 123")
Fixed 'Thread.ModuleTLSIndex' error - which caused us TLS lookup failures in Beef DLLs
Fixed some hotswap errors
Made BeefPerf shut down properly
Fixed an 'int literal' FixIntUnknown issue where rhs was System.Object which caused an illegal boxing
Fixed COFF::LocateSymbol issues with Win32 and also with linking to static libraries - showed up with hot-linking in fmod when hot-adding a floating point mod
Fixed a couple memory leaks
Fixed alignment issue in COFF::ParseCompileUnit
2019-09-02 17:39:47 -07:00

117 lines
No EOL
5.3 KiB
C++

#pragma once
#include "X86Target.h"
#include "DbgModule.h"
NS_BF_DBG_BEGIN
class HotHeap;
static const int DBG_MAX_LOOKBACK = 64*1024;
class WdStackFrame;
enum DbgOnDemandKind
{
DbgOnDemandKind_None,
DbgOnDemandKind_LocalOnly,
DbgOnDemandKind_AllowRemote
};
class DebugTarget
{
public:
WinDebugger* mDebugger;
DbgRadixMap<DbgSymbol*> mSymbolMap;
DbgAutoStaticEntryBucketMap mAutoStaticEntryBucketMap;
Array<Array<DbgAutoStaticEntry> > mAutoStaticEntryBuckets;
DbgRadixMap<DbgSubprogramMapEntry*> mSubprogramMap;
DbgRadixMap<DbgExceptionDirectoryEntry*> mExceptionDirectoryMap;
DbgRadixMap<DbgCompileUnitContrib*> mContribMap;
Array<String>* mCapturedNamesPtr;
Array<DbgType*>* mCapturedTypesPtr;
HotHeap* mHotHeap;
int mLastHotHeapCleanIdx;
String mTargetPath;
DbgModule* mLaunchBinary;
DbgModule* mTargetBinary;
//DbgModule* m
Array<DbgModule*> mDbgModules;
//DbgModule* mLastDWARF;
HashSet<DbgSrcFile*> mPendingSrcFileRehup; // Waiting to remove old/invalid line info
BumpAllocator mAlloc;
bool mWasLocallyBuilt;
bool mIsEmpty;
bool mCheckedCompilerSettings;
bool mBfObjectHasFlags;
bool mBfObjectHasVDataExtender;
int mBfObjectVDataIntefaceSlotCount;
int mBfObjectSize;
Array<DwCommonFrameDescriptor*> mCommonFrameDescriptors;
std::map<addr_target, DwFrameDescriptor> mDwFrameDescriptorMap;
std::map<addr_target, COFFFrameDescriptorEntry> mCOFFFrameDescriptorMap;
//Array<DbgSrcFile*> mSrcFiles;
Dictionary<String, DbgSrcFile*> mSrcFiles;
Dictionary<String, String> mLocalToOrigSrcMap;
protected:
bool RollBackStackFrame_ExceptionDirectory(addr_target findPC, CPURegisters* registers, addr_target* outReturnAddressLoc, bool& alreadyRolledBackPC);
bool RollBackStackFrame_ExceptionDirectory(CPURegisters* registers, addr_target* outReturnAddressLoc, bool& alreadyRolledBackPC);
bool RollBackStackFrame_DwFrameDescriptor(CPURegisters* registers, addr_target* outReturnAddressLoc);
bool RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers, addr_target* outReturnAddressLoc, bool isStackStart);
bool PropogateRegisterUpCallStack_ExceptionDirectory(addr_target findPC, CPURegisters* callerRegisters, CPURegisters* calleeRegisters, void* regPtr, bool& wasSaved);
void RemoveTargetData();
bool GetValueByNameInBlock_Helper(DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, String& name, WdStackFrame* stackFrame, intptr* outAddr, DbgType** outType, DbgAddrType* outAddrType);
public:
DebugTarget(WinDebugger* debugger);
~DebugTarget();
DbgModule* Init(const StringImpl& launchPath, const StringImpl& targetPath, intptr imageBase = 0);
void SetupTargetBinary();
void CheckTargetBinary(DbgModule* module);
void CreateEmptyTarget();
DbgModule* HotLoad(const StringImpl& fileName, int hotIdx);
DbgModule* SetupDyn(const StringImpl& filePath, DataStream* stream, intptr imageBase);
String UnloadDyn(addr_target imageBase);
void CleanupHotHeap();
void RehupSrcFiles();
DbgSrcFile* AddSrcFile(const String& srcFilePath);
DbgSrcFile* GetSrcFile(const String& srcFilePath);
bool FindSymbolAt(addr_target addr, String* outSymbol, addr_target* outOffset = NULL, DbgModule** outDWARF = NULL);
addr_target FindSymbolAddr(const StringImpl& name);
addr_target GetStaticAddress(DbgVariable* dwVariable);
DbgSubprogram* FindSubProgram(addr_target address, DbgOnDemandKind onDemandKind = DbgOnDemandKind_AllowRemote);
void GetCompilerSettings();
void AddAutoStaticEntry(const DbgAutoStaticEntry& entry);
void IterateAutoStaticEntries(uint64 memoryRangeStart, uint64 memoryRangeLen, std::function<void(DbgAutoStaticEntry const&)>& func);
void EvaluateAutoStaticVariable(DbgVariable* variable, const StringImpl& fullName);
bool GetValueByName(DbgSubprogram* dwSubprogram, const StringImpl& name, WdStackFrame* stackFrame, intptr* outAddr, DbgType** outType, DbgAddrType* outAddrType);
//bool GetValueByName(const StringImpl& name, CPURegisters* registers, addr_target* outAddr, DbgType** outType, bool* outIsAddr);
bool GetValueByNameInBlock(DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, String& name, WdStackFrame* stackFrame, intptr* outAddr, DbgType** outType, DbgAddrType* outAddrType);
void GetAutoValueNames(DbgAutoValueMapType& outAutos, WdStackFrame* stackFrame, uint64 memoryRangeStart, uint64 memoryRangeLen);
void GetAutoValueNamesInBlock(DbgAutoValueMapType& outAutos, DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, WdStackFrame* stackFrame, uint64 memoryRangeStart, uint64 memoryRangeLen);
bool GetAutoLocalsInBlock(Array<String>& outLocals, DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, WdStackFrame* stackFrame, DbgLineData* dwLineData);
bool RollBackStackFrame(CPURegisters* registers, addr_target* outReturnAddressLoc, bool isStackStart);
bool PropogateRegisterUpCallStack(CPURegisters* callerRegisters, CPURegisters* calleeRegisters, void* regPtr, bool& wasSaved);
int GetFrameBaseRegister(DbgSubprogram* dwSubprogram);
bool GetVariableIndexRegisterAndOffset(DbgVariable* dwVariable, int* outRegister, int* outOffset);
const DbgMemoryFlags ReadOrigImageData(addr_target address, uint8* data, int size);
bool DecodeInstruction(addr_target address, CPUInst* inst);
bool IsObjectAccessBreak(addr_target address, CPURegisters* regs, intptr_target* objAddr);
DbgModule* FindDbgModuleForAddress(addr_target address);
DbgModule* GetMainDbgModule();
void ReportMemory(MemReporter* memReporter);
};
NS_BF_DBG_END