HRESULT CordbAppDomain::Detach() { PUBLIC_REENTRANT_API_ENTRY(this); // may be called from IMDA::Detach FAIL_IF_NEUTERED(this); return E_NOTIMPL; }
HRESULT CordbRegisterSet::GetRegisters(ULONG64 mask, ULONG32 regCount, CORDB_REGISTER regBuffer[]) { PUBLIC_REENTRANT_API_ENTRY(this); FAIL_IF_NEUTERED(this); ATT_REQUIRE_STOPPED_MAY_FAIL(GetProcess()); UINT iRegister = 0; VALIDATE_POINTER_TO_OBJECT_ARRAY(regBuffer, CORDB_REGISTER, regCount, true, true); // @ARMTODO: floating point support for (int i = REGISTER_INSTRUCTION_POINTER; i <= REGISTER_ARM_LR && iRegister < regCount; i++) { if (mask & SETBITULONG64(i)) { switch (i) { case REGISTER_INSTRUCTION_POINTER: regBuffer[iRegister++] = m_rd->PC; break; case REGISTER_STACK_POINTER: regBuffer[iRegister++] = m_rd->SP; break; case REGISTER_ARM_R0: regBuffer[iRegister++] = m_rd->R0; break; case REGISTER_ARM_R1: regBuffer[iRegister++] = m_rd->R1; break; case REGISTER_ARM_R2: regBuffer[iRegister++] = m_rd->R2; break; case REGISTER_ARM_R3: regBuffer[iRegister++] = m_rd->R3; break; case REGISTER_ARM_R4: regBuffer[iRegister++] = m_rd->R4; break; case REGISTER_ARM_R5: regBuffer[iRegister++] = m_rd->R5; break; case REGISTER_ARM_R6: regBuffer[iRegister++] = m_rd->R6; break; case REGISTER_ARM_R7: regBuffer[iRegister++] = m_rd->R7; break; case REGISTER_ARM_R8: regBuffer[iRegister++] = m_rd->R8; break; case REGISTER_ARM_R9: regBuffer[iRegister++] = m_rd->R9; break; case REGISTER_ARM_R10: regBuffer[iRegister++] = m_rd->R10; break; case REGISTER_ARM_R11: regBuffer[iRegister++] = m_rd->R11; break; case REGISTER_ARM_R12: regBuffer[iRegister++] = m_rd->R12; break; case REGISTER_ARM_LR: regBuffer[iRegister++] = m_rd->LR; break; } } } _ASSERTE (iRegister <= regCount); return S_OK; }
HRESULT CordbRegisterSet::GetRegistersAvailable(ULONG32 regCount, BYTE pAvailable[]) { PUBLIC_REENTRANT_API_ENTRY(this); FAIL_IF_NEUTERED(this); VALIDATE_POINTER_TO_OBJECT_ARRAY(pAvailable, CORDB_REGISTER, regCount, true, true); // Defer to adapter for v1.0 interface return GetRegistersAvailableAdapter(regCount, pAvailable); }
HRESULT CordbRegisterSet::GetRegisters(ULONG32 maskCount, BYTE mask[], ULONG32 regCount, CORDB_REGISTER regBuffer[]) { PUBLIC_REENTRANT_API_ENTRY(this); FAIL_IF_NEUTERED(this); VALIDATE_POINTER_TO_OBJECT_ARRAY(regBuffer, CORDB_REGISTER, regCount, true, true); // Defer to adapter for v1.0 interface return GetRegistersAdapter(maskCount, mask, regCount, regBuffer); }
/* * GetProcess returns the process containing the app domain */ HRESULT CordbAppDomain::GetProcess(ICorDebugProcess **ppProcess) { PUBLIC_REENTRANT_API_ENTRY(this); FAIL_IF_NEUTERED(this); VALIDATE_POINTER_TO_OBJECT(ppProcess,ICorDebugProcess **); _ASSERTE (m_pProcess != NULL); *ppProcess = static_cast<ICorDebugProcess *> (m_pProcess); m_pProcess->ExternalAddRef(); return S_OK; }
HRESULT CordbRegisterSet::GetRegisters(ULONG64 mask, ULONG32 regCount, CORDB_REGISTER regBuffer[]) { PUBLIC_REENTRANT_API_ENTRY(this); FAIL_IF_NEUTERED(this); ATT_REQUIRE_STOPPED_MAY_FAIL(GetProcess()); UINT iRegister = 0; VALIDATE_POINTER_TO_OBJECT_ARRAY(regBuffer, CORDB_REGISTER, regCount, true, true); // @ARM64TODO: floating point support for (int i = REGISTER_ARM64_X0; i <= REGISTER_ARM64_PC && iRegister < regCount; i++) { if (mask & SETBITULONG64(i)) { if ((i >= REGISTER_ARM64_X0) && (i <= REGISTER_ARM64_X28)) { regBuffer[iRegister++] = m_rd->X[i - REGISTER_ARM64_X0]; continue; } switch (i) { case REGISTER_ARM64_PC: regBuffer[iRegister++] = m_rd->PC; break; case REGISTER_ARM64_SP: regBuffer[iRegister++] = m_rd->SP; break; case REGISTER_ARM64_FP: regBuffer[iRegister++] = m_rd->FP; break; case REGISTER_ARM64_LR: regBuffer[iRegister++] = m_rd->LR; break; default: _ASSERTE(false); break; } } } _ASSERTE (iRegister <= regCount); return S_OK; }
//----------------------------------------------------------------------------- // Get a ICorDebugValue for a static field on this class. // // Parameters: // fieldDef - metadata token for field on this class. Can not be from an // inherited class. // pFrame - frame used to resolve Thread-static, AppDomain-static, etc. // ppValue - OUT: gets value of the field. // // Returns: // S_OK on success. // CORDBG_E_STATIC_VAR_NOT_AVAILABLE //----------------------------------------------------------------------------- HRESULT CordbClass::GetStaticFieldValue(mdFieldDef fieldDef, ICorDebugFrame *pFrame, ICorDebugValue **ppValue) { PUBLIC_REENTRANT_API_ENTRY(this); FAIL_IF_NEUTERED(this); VALIDATE_POINTER_TO_OBJECT(ppValue, ICorDebugValue **); ATT_REQUIRE_STOPPED_MAY_FAIL(GetProcess()); HRESULT hr = S_OK; *ppValue = NULL; BOOL fEnCHangingField = FALSE; IMetaDataImport * pImport = NULL; EX_TRY { pImport = GetModule()->GetMetaDataImporter(); // throws // Validate the token. if (!pImport->IsValidToken(fieldDef) || (TypeFromToken(fieldDef) != mdtFieldDef)) { ThrowHR(E_INVALIDARG); } // Make sure we have enough info about the class. Init(); // Uninstantiated generics (eg, Foo<T>) don't have static data. Must use instantiated (eg Foo<int>) // But all CordbClass instances are uninstantiated. So this should fail for all generic types. // Normally, debuggers should be using ICorDebugType instead. // Though in the forward compat case, they'll hit this. if (HasTypeParams()) { ThrowHR(CORDBG_E_STATIC_VAR_NOT_AVAILABLE); } // Lookup the field given its metadata token. FieldData *pFieldData; hr = GetFieldInfo(fieldDef, &pFieldData); // This field was added by EnC, need to use EnC specific code path if (hr == CORDBG_E_ENC_HANGING_FIELD) { // Static fields added with EnC hang off the EnCFieldDesc hr = GetEnCHangingField(fieldDef, &pFieldData, NULL); if (SUCCEEDED(hr)) { fEnCHangingField = TRUE; } // Note: the FieldOffset in pFieldData has been cooked to produce // the correct address of the field in the syncBlock. // @todo: extend Debugger_IPCEFieldData so we don't have to cook the offset here } IfFailThrow(hr); { Instantiation emptyInst; hr = CordbClass::GetStaticFieldValue2(GetModule(), pFieldData, fEnCHangingField, &emptyInst, pFrame, ppValue); // Let hr fall through } } EX_CATCH_HRESULT(hr); // Translate Failure HRs. if (pImport != NULL) { hr = CordbClass::PostProcessUnavailableHRESULT(hr, pImport, fieldDef); } return hr; }