DebugTarget.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #pragma once
  2. #include "X86Target.h"
  3. #include "DbgModule.h"
  4. NS_BF_DBG_BEGIN
  5. class HotHeap;
  6. static const int DBG_MAX_LOOKBACK = 64*1024;
  7. class WdStackFrame;
  8. enum DbgOnDemandKind
  9. {
  10. DbgOnDemandKind_None,
  11. DbgOnDemandKind_LocalOnly,
  12. DbgOnDemandKind_AllowRemote
  13. };
  14. struct FindDbgModuleCacheEntry
  15. {
  16. DbgModule* mFirst;
  17. Array<DbgModule*>* mCollisions;
  18. FindDbgModuleCacheEntry()
  19. {
  20. mFirst = NULL;
  21. mCollisions = NULL;
  22. }
  23. };
  24. class DebugTarget
  25. {
  26. public:
  27. WinDebugger* mDebugger;
  28. DbgRadixMap<DbgSymbol*> mSymbolMap;
  29. DbgAutoStaticEntryBucketMap mAutoStaticEntryBucketMap;
  30. Array<Array<DbgAutoStaticEntry> > mAutoStaticEntryBuckets;
  31. DbgRadixMap<DbgSubprogramMapEntry*> mSubprogramMap;
  32. DbgRadixMap<DbgExceptionDirectoryEntry*> mExceptionDirectoryMap;
  33. DbgRadixMap<DbgCompileUnitContrib*> mContribMap;
  34. Array<String>* mCapturedNamesPtr;
  35. Array<DbgType*>* mCapturedTypesPtr;
  36. HotHeap* mHotHeap;
  37. addr_target mHotHeapAddr;
  38. int64 mHotHeapReserveSize;
  39. int mLastHotHeapCleanIdx;
  40. int mVDataHotIdx;
  41. String mTargetPath;
  42. DbgModule* mLaunchBinary;
  43. DbgModule* mTargetBinary;
  44. Array<DbgModule*> mDbgModules;
  45. Dictionary<int, DbgModule*> mDbgModuleMap;
  46. Dictionary<addr_target, FindDbgModuleCacheEntry> mFindDbgModuleCache; // Addresses are all 64k multiples
  47. HashSet<DbgSrcFile*> mPendingSrcFileRehup; // Waiting to remove old/invalid line info
  48. BumpAllocator mAlloc;
  49. bool mWasLocallyBuilt;
  50. bool mIsEmpty;
  51. bool mCheckedCompilerSettings;
  52. bool mBfObjectHasFlags;
  53. bool mBfObjectHasVDataExtender;
  54. bool mBfHasLargeStrings;
  55. bool mBfHasLargeCollections;
  56. int mBfObjectVDataIntefaceSlotCount;
  57. int mBfObjectSize;
  58. int mCurModuleId;
  59. Array<DwCommonFrameDescriptor*> mCommonFrameDescriptors;
  60. std::map<addr_target, DwFrameDescriptor> mDwFrameDescriptorMap;
  61. std::map<addr_target, COFFFrameDescriptorEntry> mCOFFFrameDescriptorMap;
  62. Dictionary<String, DbgSrcFile*> mSrcFiles;
  63. Dictionary<String, String> mLocalToOrigSrcMap;
  64. protected:
  65. bool RollBackStackFrame_ExceptionDirectory(addr_target findPC, CPURegisters* registers, addr_target* outReturnAddressLoc, bool& alreadyRolledBackPC);
  66. bool RollBackStackFrame_ExceptionDirectory(CPURegisters* registers, addr_target* outReturnAddressLoc, bool& alreadyRolledBackPC);
  67. bool RollBackStackFrame_DwFrameDescriptor(CPURegisters* registers, addr_target* outReturnAddressLoc);
  68. bool RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers, addr_target* outReturnAddressLoc, bool isStackStart);
  69. bool RollBackStackFrame_SimpleRet(CPURegisters* registers);
  70. bool PropogateRegisterUpCallStack_ExceptionDirectory(addr_target findPC, CPURegisters* callerRegisters, CPURegisters* calleeRegisters, void* regPtr, bool& wasSaved);
  71. void RemoveTargetData();
  72. bool GetValueByNameInBlock_Helper(DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, String& name, WdStackFrame* stackFrame, intptr* outAddr, DbgType** outType, DbgAddrType* outAddrType);
  73. public:
  74. DebugTarget(WinDebugger* debugger);
  75. ~DebugTarget();
  76. void ClearFindDbgModuleCache();
  77. void AddDbgModule(DbgModule* dbgModule);
  78. DbgModule* Init(const StringImpl& launchPath, const StringImpl& targetPath, intptr imageBase = 0);
  79. void SetupTargetBinary();
  80. void CheckTargetBinary(DbgModule* module);
  81. void CreateEmptyTarget();
  82. DbgModule* HotLoad(const StringImpl& fileName, int hotIdx);
  83. DbgModule* SetupDyn(const StringImpl& filePath, DataStream* stream, intptr imageBase);
  84. String UnloadDyn(addr_target imageBase);
  85. void CleanupHotHeap();
  86. void RehupSrcFiles();
  87. DbgSrcFile* AddSrcFile(const String& srcFilePath);
  88. DbgSrcFile* GetSrcFile(const String& srcFilePath);
  89. bool FindSymbolAt(addr_target addr, String* outSymbol, addr_target* outOffset = NULL, DbgModule** outDWARF = NULL, bool allowRemote = true);
  90. addr_target FindSymbolAddr(const StringImpl& name);
  91. addr_target GetStaticAddress(DbgVariable* dwVariable);
  92. DbgSubprogram* FindSubProgram(addr_target address, DbgOnDemandKind onDemandKind = DbgOnDemandKind_AllowRemote);
  93. void GetCompilerSettings();
  94. void AddAutoStaticEntry(const DbgAutoStaticEntry& entry);
  95. void IterateAutoStaticEntries(uint64 memoryRangeStart, uint64 memoryRangeLen, std::function<void(DbgAutoStaticEntry const&)>& func);
  96. void EvaluateAutoStaticVariable(DbgVariable* variable, const StringImpl& fullName);
  97. bool GetValueByName(DbgSubprogram* dwSubprogram, const StringImpl& name, WdStackFrame* stackFrame, intptr* outAddr, DbgType** outType, DbgAddrType* outAddrType);
  98. //bool GetValueByName(const StringImpl& name, CPURegisters* registers, addr_target* outAddr, DbgType** outType, bool* outIsAddr);
  99. bool GetValueByNameInBlock(DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, String& name, WdStackFrame* stackFrame, intptr* outAddr, DbgType** outType, DbgAddrType* outAddrType);
  100. void GetAutoValueNames(DbgAutoValueMapType& outAutos, WdStackFrame* stackFrame, uint64 memoryRangeStart, uint64 memoryRangeLen);
  101. void GetAutoValueNamesInBlock(DbgAutoValueMapType& outAutos, DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, WdStackFrame* stackFrame, uint64 memoryRangeStart, uint64 memoryRangeLen);
  102. bool GetAutoLocalsInBlock(Array<String>& outLocals, DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, WdStackFrame* stackFrame, DbgLineData* dwLineData);
  103. bool RollBackStackFrame(CPURegisters* registers, addr_target* outReturnAddressLoc, bool isStackStart);
  104. bool PropogateRegisterUpCallStack(CPURegisters* callerRegisters, CPURegisters* calleeRegisters, void* regPtr, bool& wasSaved);
  105. int GetFrameBaseRegister(DbgSubprogram* dwSubprogram);
  106. bool GetVariableIndexRegisterAndOffset(DbgVariable* dwVariable, int* outRegister, int* outOffset);
  107. const DbgMemoryFlags ReadOrigImageData(addr_target address, uint8* data, int size);
  108. bool DecodeInstruction(addr_target address, CPUInst* inst);
  109. DbgBreakKind GetDbgBreakKind(addr_target address, CPURegisters* regs, intptr_target* objAddr);
  110. DbgModule* FindDbgModuleForAddress(addr_target address);
  111. DbgModule* GetMainDbgModule();
  112. void ReportMemory(MemReporter* memReporter);
  113. };
  114. NS_BF_DBG_END