Changeset 35502 in vbox
- Timestamp:
- Jan 12, 2011 11:19:30 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 69385
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-client/MachineDebuggerImpl.cpp
r35466 r35502 1043 1043 } 1044 1044 1045 /** 1046 * Formats a register value. 1047 * 1048 * This is used by both register getter methods. 1049 * 1050 * @returns 1051 * @param a_pbstr The output Bstr variable. 1052 * @param a_pValue The value to format. 1053 * @param a_enmType The type of the value. 1054 */ 1055 static HRESULT formatRegisterValue(Bstr *a_pbstr, PCDBGFREGVAL a_pValue, DBGFREGVALTYPE a_enmType) 1056 { 1057 char szHex[128]; /* Must be big because RTStrFormatNumber is unsafe. */ 1058 1059 switch (a_enmType) 1060 { 1061 case DBGFREGVALTYPE_U8: 1062 RTStrFormatNumber(szHex, a_pValue->u8, 16, 2+2, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_8BIT); 1063 *a_pbstr = szHex; 1064 return S_OK; 1065 1066 case DBGFREGVALTYPE_U16: 1067 RTStrFormatNumber(szHex, a_pValue->u16, 16, 2+4, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_16BIT); 1068 *a_pbstr = szHex; 1069 return S_OK; 1070 1071 case DBGFREGVALTYPE_U32: 1072 RTStrFormatNumber(szHex, a_pValue->u32, 16, 2+8, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_32BIT); 1073 *a_pbstr = szHex; 1074 return S_OK; 1075 1076 case DBGFREGVALTYPE_U64: 1077 RTStrFormatNumber(szHex, a_pValue->u64, 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT); 1078 *a_pbstr = szHex; 1079 return S_OK; 1080 1081 case DBGFREGVALTYPE_U128: 1082 RTStrFormatNumber(szHex, a_pValue->au64[1], 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT); 1083 RTStrFormatNumber(&szHex[2+16], a_pValue->au64[0], 16, 16, 0, RTSTR_F_ZEROPAD | RTSTR_F_64BIT); 1084 *a_pbstr = szHex; 1085 return S_OK; 1086 1087 case DBGFREGVALTYPE_LRD: 1088 /** @todo long double -> string conversion. */ 1089 /** @todo long double == double on MSC. Stupid, stupid, 1090 * microsoft! */ 1091 RTStrFormatNumber(szHex, a_pValue->au16[5], 16, 2+4, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_16BIT); 1092 RTStrFormatNumber(&szHex[2+4], a_pValue->au64[0], 16, 16, 0, RTSTR_F_ZEROPAD | RTSTR_F_64BIT); 1093 *a_pbstr = szHex; 1094 return S_OK; 1095 1096 case DBGFREGVALTYPE_DTR: 1097 RTStrFormatNumber(szHex, a_pValue->dtr.u64Base, 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT); 1098 szHex[2+16] = ':'; 1099 RTStrFormatNumber(&szHex[2+16+1], a_pValue->dtr.u32Limit, 16, 4, 0, RTSTR_F_ZEROPAD | RTSTR_F_32BIT); 1100 *a_pbstr = szHex; 1101 return S_OK; 1102 1103 case DBGFREGVALTYPE_INVALID: 1104 case DBGFREGVALTYPE_END: 1105 case DBGFREGVALTYPE_32BIT_HACK: 1106 break; 1107 /* no default */ 1108 } 1109 1110 return E_UNEXPECTED; 1111 } 1112 1045 1113 STDMETHODIMP MachineDebugger::GetRegister(ULONG a_idCpu, IN_BSTR a_bstrName, BSTR *a_pbstrValue) 1046 1114 { 1047 ReturnComNotImplemented(); 1048 } 1049 1050 STDMETHODIMP MachineDebugger::GetRegisters(ULONG a_idCpu, ComSafeArrayOut(BSTR, a_bstrNames), ComSafeArrayOut(BSTR, a_bstrValues)) 1051 { 1115 /* 1116 * Validate and convert input. 1117 */ 1118 CheckComArgStrNotEmptyOrNull(a_bstrName); 1119 CheckComArgNotNull(a_pbstrValue); 1120 Utf8Str strName; 1121 try 1122 { 1123 strName = a_bstrName; 1124 } 1125 catch (std::bad_alloc) 1126 { 1127 return E_OUTOFMEMORY; 1128 } 1129 1052 1130 /* 1053 1131 * The prologue. … … 1066 1144 * Real work. 1067 1145 */ 1146 DBGFREGVAL Value; 1147 DBGFREGVALTYPE enmType; 1148 int vrc = DBGFR3RegNmQuery(ptrVM.raw(), a_idCpu, strName.c_str(), &Value, &enmType); 1149 if (RT_SUCCESS(vrc)) 1150 { 1151 try 1152 { 1153 Bstr bstrValue; 1154 hrc = formatRegisterValue(&bstrValue, &Value, enmType); 1155 if (SUCCEEDED(hrc)) 1156 bstrValue.detachTo(a_pbstrValue); 1157 } 1158 catch (std::bad_alloc) 1159 { 1160 hrc = E_OUTOFMEMORY; 1161 } 1162 } 1163 } 1164 } 1165 1166 return hrc; 1167 } 1168 1169 STDMETHODIMP MachineDebugger::GetRegisters(ULONG a_idCpu, ComSafeArrayOut(BSTR, a_bstrNames), ComSafeArrayOut(BSTR, a_bstrValues)) 1170 { 1171 /* 1172 * The prologue. 1173 */ 1174 LogFlowThisFunc(("\n")); 1175 AutoCaller autoCaller(this); 1176 HRESULT hrc = autoCaller.rc(); 1177 if (SUCCEEDED(hrc)) 1178 { 1179 AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); 1180 Console::SafeVMPtr ptrVM(mParent); 1181 hrc = ptrVM.rc(); 1182 if (SUCCEEDED(hrc)) 1183 { 1184 /* 1185 * Real work. 1186 */ 1187 /** @todo query all registers. */ 1068 1188 DBGFREGENTRY aRegs[DBGFREG_ALL_COUNT]; 1069 1189 int vrc = DBGFR3RegCpuQueryAll(ptrVM.raw(), a_idCpu, aRegs, RT_ELEMENTS(aRegs)); … … 1078 1198 { 1079 1199 char szHex[128]; 1080 1081 szHex[0] = '\0'; 1082 switch (aRegs[iReg].enmType) 1083 { 1084 case DBGFREGVALTYPE_U8: 1085 RTStrFormatNumber(szHex, aRegs[iReg].Val.u8, 16, 2+2, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_8BIT); 1086 break; 1087 case DBGFREGVALTYPE_U16: 1088 RTStrFormatNumber(szHex, aRegs[iReg].Val.u16, 16, 2+4, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_16BIT); 1089 break; 1090 case DBGFREGVALTYPE_U32: 1091 RTStrFormatNumber(szHex, aRegs[iReg].Val.u32, 16, 2+8, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_32BIT); 1092 break; 1093 case DBGFREGVALTYPE_U64: 1094 RTStrFormatNumber(szHex, aRegs[iReg].Val.u64, 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT); 1095 break; 1096 case DBGFREGVALTYPE_U128: 1097 RTStrFormatNumber(szHex, aRegs[iReg].Val.au64[1], 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT); 1098 RTStrFormatNumber(&szHex[2+16], aRegs[iReg].Val.au64[0], 16, 16, 0, RTSTR_F_ZEROPAD | RTSTR_F_64BIT); 1099 break; 1100 case DBGFREGVALTYPE_LRD: 1101 /** @todo long double -> string conversion. */ 1102 RTStrFormatNumber(szHex, aRegs[iReg].Val.au16[5], 16, 2+4, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_16BIT); 1103 RTStrFormatNumber(&szHex[2+4], aRegs[iReg].Val.au64[0], 16, 16, 0, RTSTR_F_ZEROPAD | RTSTR_F_64BIT); 1104 break; 1105 case DBGFREGVALTYPE_DTR: 1106 RTStrFormatNumber(szHex, aRegs[iReg].Val.dtr.u64Base, 16, 2+16, 0, RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD | RTSTR_F_64BIT); 1107 szHex[2+16] = ':'; 1108 RTStrFormatNumber(&szHex[2+16+1], aRegs[iReg].Val.dtr.u32Limit, 16, 4, 0, RTSTR_F_ZEROPAD | RTSTR_F_32BIT); 1109 break; 1110 1111 case DBGFREGVALTYPE_END: 1112 case DBGFREGVALTYPE_INVALID: 1113 case DBGFREGVALTYPE_32BIT_HACK: 1114 break; 1115 } 1116 Assert(szHex[0]); 1117 1118 Bstr bstrValue(szHex); 1200 Bstr bstrValue; 1201 1202 hrc = formatRegisterValue(&bstrValue, &aRegs[iReg].Val, aRegs[iReg].enmType); 1203 AssertComRC(hrc); 1119 1204 bstrValue.detachTo(&abstrValues[iReg]); 1120 1205
Note:
See TracChangeset
for help on using the changeset viewer.