DebugTarget.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. int mHotChainBreakIdx;
  42. String mTargetPath;
  43. DbgModule* mLaunchBinary;
  44. DbgModule* mTargetBinary;
  45. Array<DbgModule*> mDbgModules;
  46. Dictionary<int, DbgModule*> mDbgModuleMap;
  47. Dictionary<addr_target, FindDbgModuleCacheEntry> mFindDbgModuleCache; // Addresses are all 64k multiples
  48. HashSet<DbgSrcFile*> mPendingSrcFileRehup; // Waiting to remove old/invalid line info
  49. BumpAllocator mAlloc;
  50. bool mWasLocallyBuilt;
  51. bool mIsEmpty;
  52. bool mCheckedCompilerSettings;
  53. bool mBfObjectHasFlags;
  54. bool mBfObjectHasVDataExtender;
  55. bool mBfHasLargeStrings;
  56. bool mBfHasLargeCollections;
  57. int mBfObjectVDataIntefaceSlotCount;
  58. int mBfObjectSize;
  59. int mCurModuleId;
  60. Array<DwCommonFrameDescriptor*> mCommonFrameDescriptors;
  61. std::map<addr_target, DwFrameDescriptor> mDwFrameDescriptorMap;
  62. std::map<addr_target, COFFFrameDescriptorEntry> mCOFFFrameDescriptorMap;
  63. Dictionary<String, DbgSrcFile*> mSrcFiles;
  64. Dictionary<String, String> mLocalToOrigSrcMap;
  65. protected:
  66. bool RollBackStackFrame_ExceptionDirectory(addr_target findPC, CPURegisters* registers, addr_target* outReturnAddressLoc, bool& alreadyRolledBackPC);
  67. bool RollBackStackFrame_ExceptionDirectory(CPURegisters* registers, addr_target* outReturnAddressLoc, bool& alreadyRolledBackPC);
  68. bool RollBackStackFrame_DwFrameDescriptor(CPURegisters* registers, addr_target* outReturnAddressLoc);
  69. bool RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers, addr_target* outReturnAddressLoc, bool isStackStart);
  70. bool RollBackStackFrame_SimpleRet(CPURegisters* registers);
  71. bool PropogateRegisterUpCallStack_ExceptionDirectory(addr_target findPC, CPURegisters* callerRegisters, CPURegisters* calleeRegisters, void* regPtr, bool& wasSaved);
  72. void RemoveTargetData();
  73. bool GetValueByNameInBlock_Helper(DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, String& name, WdStackFrame* stackFrame, intptr* outAddr, DbgType** outType, DbgAddrType* outAddrType);
  74. public:
  75. DebugTarget(WinDebugger* debugger);
  76. ~DebugTarget();
  77. void ClearFindDbgModuleCache();
  78. void AddDbgModule(DbgModule* dbgModule);
  79. DbgModule* Init(const StringImpl& launchPath, const StringImpl& targetPath, intptr imageBase = 0);
  80. void SetupTargetBinary();
  81. void CheckTargetBinary(DbgModule* module);
  82. void CreateEmptyTarget();
  83. DbgModule* HotLoad(const StringImpl& fileName, int hotIdx);
  84. DbgModule* SetupDyn(const StringImpl& filePath, DataStream* stream, intptr imageBase);
  85. String UnloadDyn(addr_target imageBase);
  86. void CleanupHotHeap();
  87. void RehupSrcFiles();
  88. DbgSrcFile* AddSrcFile(const String& srcFilePath);
  89. DbgSrcFile* GetSrcFile(const String& srcFilePath);
  90. bool FindSymbolAt(addr_target addr, String* outSymbol, addr_target* outOffset = NULL, DbgModule** outDWARF = NULL, bool allowRemote = true);
  91. addr_target FindSymbolAddr(const StringImpl& name);
  92. addr_target GetStaticAddress(DbgVariable* dwVariable);
  93. DbgSubprogram* FindSubProgram(addr_target address, DbgOnDemandKind onDemandKind = DbgOnDemandKind_AllowRemote);
  94. void GetCompilerSettings();
  95. void AddAutoStaticEntry(const DbgAutoStaticEntry& entry);
  96. void IterateAutoStaticEntries(uint64 memoryRangeStart, uint64 memoryRangeLen, std::function<void(DbgAutoStaticEntry const&)>& func);
  97. void EvaluateAutoStaticVariable(DbgVariable* variable, const StringImpl& fullName);
  98. bool GetValueByName(DbgSubprogram* dwSubprogram, const StringImpl& name, WdStackFrame* stackFrame, intptr* outAddr, DbgType** outType, DbgAddrType* outAddrType);
  99. //bool GetValueByName(const StringImpl& name, CPURegisters* registers, addr_target* outAddr, DbgType** outType, bool* outIsAddr);
  100. bool GetValueByNameInBlock(DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, String& name, WdStackFrame* stackFrame, intptr* outAddr, DbgType** outType, DbgAddrType* outAddrType);
  101. void GetAutoValueNames(DbgAutoValueMapType& outAutos, WdStackFrame* stackFrame, uint64 memoryRangeStart, uint64 memoryRangeLen);
  102. void GetAutoValueNamesInBlock(DbgAutoValueMapType& outAutos, DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, WdStackFrame* stackFrame, uint64 memoryRangeStart, uint64 memoryRangeLen);
  103. bool GetAutoLocalsInBlock(Array<String>& outLocals, DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, WdStackFrame* stackFrame, DbgLineData* dwLineData);
  104. bool RollBackStackFrame(CPURegisters* registers, addr_target* outReturnAddressLoc, bool isStackStart);
  105. bool PropogateRegisterUpCallStack(CPURegisters* callerRegisters, CPURegisters* calleeRegisters, void* regPtr, bool& wasSaved);
  106. int GetFrameBaseRegister(DbgSubprogram* dwSubprogram);
  107. bool GetVariableIndexRegisterAndOffset(DbgVariable* dwVariable, int* outRegister, int* outOffset);
  108. const DbgMemoryFlags ReadOrigImageData(addr_target address, uint8* data, int size);
  109. bool DecodeInstruction(addr_target address, CPUInst* inst);
  110. DbgBreakKind GetDbgBreakKind(addr_target address, CPURegisters* regs, intptr_target* objAddr);
  111. DbgModule* FindDbgModuleForAddress(addr_target address);
  112. DbgModule* GetMainDbgModule();
  113. void ReportMemory(MemReporter* memReporter);
  114. };
  115. NS_BF_DBG_END