diff --git a/IDEHelper/DbgExprEvaluator.cpp b/IDEHelper/DbgExprEvaluator.cpp index b85d9d9f..0f09cfcc 100644 --- a/IDEHelper/DbgExprEvaluator.cpp +++ b/IDEHelper/DbgExprEvaluator.cpp @@ -1134,32 +1134,48 @@ DbgTypedValue DbgExprEvaluator::GetBeefTypeById(int typeId) if (mDebugTarget->mTargetBinary == NULL) return DbgTypedValue(); - mDebugTarget->mTargetBinary->ParseTypeData(); - auto typeTypeEntry = mDebugTarget->mTargetBinary->FindType("System.Type", DbgLanguage_Beef); - if ((typeTypeEntry == NULL) || (typeTypeEntry->mValue == NULL)) - return DbgTypedValue(); - - auto typeType = typeTypeEntry->mValue; - if (typeType->mNeedsGlobalsPopulated) - typeType->mCompileUnit->mDbgModule->PopulateTypeGlobals(typeType); - for (auto member : typeType->mMemberList) + if (mDebugTarget->mTargetBinary->mBfTypesInfoAddr == 0) { - if ((member->mIsStatic) && (member->mName != NULL) && (strcmp(member->mName, "sTypes") == 0) && (member->mLocationData != NULL)) + mDebugTarget->mTargetBinary->mBfTypesInfoAddr = -1; + + mDebugTarget->mTargetBinary->ParseTypeData(); + auto typeTypeEntry = mDebugTarget->mTargetBinary->FindType("System.Type", DbgLanguage_Beef); + if ((typeTypeEntry != NULL) && (typeTypeEntry->mValue != NULL)) { - auto stackFrame = GetStackFrame(); - DbgAddrType addrType; - intptr valAddr = member->mCompileUnit->mDbgModule->EvaluateLocation(NULL, member->mLocationData, member->mLocationLen, stackFrame, &addrType); - if (valAddr != 0) + auto typeType = typeTypeEntry->mValue; + mDebugTarget->mTargetBinary->mBfTypeType = typeType; + if (typeType->mNeedsGlobalsPopulated) + typeType->mCompileUnit->mDbgModule->PopulateTypeGlobals(typeType); + + for (auto member : typeType->mMemberList) { - DbgTypedValue typedVal; - typedVal.mType = typeType; - addr_target addr = valAddr + typeId * sizeof(addr_target); - typedVal.mSrcAddress = mDebugger->ReadMemory(addr); - return typedVal; + if ((member->mIsStatic) && (member->mName != NULL) && (strcmp(member->mName, "sTypes") == 0) && (member->mLocationData != NULL)) + { + auto stackFrame = GetStackFrame(); + DbgAddrType addrType; + mDebugTarget->mTargetBinary->mBfTypesInfoAddr = member->mCompileUnit->mDbgModule->EvaluateLocation(NULL, member->mLocationData, member->mLocationLen, stackFrame, &addrType); + } + } + + if (mDebugTarget->mTargetBinary->mBfTypesInfoAddr <= 0) + { + mDebugTarget->mTargetBinary->ParseSymbolData(); + auto entry = mDebugTarget->mTargetBinary->mSymbolNameMap.Find("?sTypes@Type@System@bf@@2PEAPEAV123@A"); + if (entry) + mDebugTarget->mTargetBinary->mBfTypesInfoAddr = entry->mValue->mAddress; } } } + if (mDebugTarget->mTargetBinary->mBfTypesInfoAddr > 0) + { + DbgTypedValue typedVal; + typedVal.mType = mDebugTarget->mTargetBinary->mBfTypeType; + addr_target addr = mDebugTarget->mTargetBinary->mBfTypesInfoAddr + typeId * sizeof(addr_target); + typedVal.mSrcAddress = mDebugger->ReadMemory(addr); + return typedVal; + } + return DbgTypedValue(); } diff --git a/IDEHelper/DbgModule.cpp b/IDEHelper/DbgModule.cpp index f34b4371..cfbac3bb 100644 --- a/IDEHelper/DbgModule.cpp +++ b/IDEHelper/DbgModule.cpp @@ -2196,6 +2196,8 @@ DbgModule::DbgModule(DebugTarget* debugTarget) : mDefaultCompileUnit(this) mMayBeOld = false; mTimeStamp = 0; mExpectedFileSize = 0; + mBfTypeType = NULL; + mBfTypesInfoAddr = 0; mImageBase = 0; mPreferredImageBase = 0; diff --git a/IDEHelper/DbgModule.h b/IDEHelper/DbgModule.h index 1daa59b9..803a5d04 100644 --- a/IDEHelper/DbgModule.h +++ b/IDEHelper/DbgModule.h @@ -1141,7 +1141,7 @@ public: bool mParsedSymbolData; bool mParsedTypeData; bool mPopulatedStaticVariables; - bool mParsedFrameDescriptors; + bool mParsedFrameDescriptors; bool mMayBeOld; // If we had to load debug info from the SymCache or a SymServer then it may be old bool mDeleting; @@ -1154,7 +1154,7 @@ public: int mStartSubprogramIdx; int mEndSubprogramIdx; int mStartTypeIdx; - int mEndTypeIdx; + int mEndTypeIdx; uintptr mPreferredImageBase; uintptr mImageBase; uint32 mImageSize; @@ -1162,6 +1162,9 @@ public: String mVersion; String* mFailMsgPtr; + DbgType* mBfTypeType; + intptr mBfTypesInfoAddr; + DbgModuleMemoryCache* mOrigImageData; DbgCompileUnit* mMasterCompileUnit; StrHashMap mGlobalVarMap; // Dedups entries into mMasterCompileUnit diff --git a/IDEHelper/WinDebugger.cpp b/IDEHelper/WinDebugger.cpp index edb43599..26b95eab 100644 --- a/IDEHelper/WinDebugger.cpp +++ b/IDEHelper/WinDebugger.cpp @@ -1234,7 +1234,8 @@ String WinDebugger::GetDbgAllocInfo() auto type = exprEvaluator.GetBeefTypeById(typeId); typeName.Clear(); exprEvaluator.BeefTypeToString(type, typeName); - + if (typeName.IsEmpty()) + typeName = StrFormat("Type #%d", typeId); result += StrFormat("type\t%d\t%s\t%lld\t%lld\n", typeId, typeName.c_str(), typeData.mCount, typeData.mSize); } }