Skip to content

Commit 706773e

Browse files
Copilotxusheng6
andcommitted
Fix TTD Calls time display issue - parse TimeStart/TimeEnd as structured objects with Sequence/Steps properties
Co-authored-by: xusheng6 <94503187+xusheng6@users.noreply.github.com>
1 parent d916555 commit 706773e

File tree

1 file changed

+36
-68
lines changed

1 file changed

+36
-68
lines changed

core/adapters/dbgengttdadapter.cpp

Lines changed: 36 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,90 +1169,58 @@ bool DbgEngTTDAdapter::ParseTTDCallObjects(const std::string& expression, std::v
11691169
ComPtr<IModelObject> timeStartObj;
11701170
if (SUCCEEDED(callObject->GetKeyValue(L"TimeStart", &timeStartObj, nullptr)))
11711171
{
1172-
// TTD Position is typically in format "sequence:step"
1173-
VARIANT vtTimeStart;
1174-
VariantInit(&vtTimeStart);
1175-
if (SUCCEEDED(timeStartObj->GetIntrinsicValueAs(VT_BSTR, &vtTimeStart)))
1172+
// TimeStart is typically a TTD position object with Sequence and Steps
1173+
ComPtr<IModelObject> sequenceObj, stepsObj;
1174+
if (SUCCEEDED(timeStartObj->GetKeyValue(L"Sequence", &sequenceObj, nullptr)))
11761175
{
1177-
_bstr_t bstr(vtTimeStart.bstrVal);
1178-
std::string timeStartStr = std::string(bstr);
1179-
1180-
// Parse "sequence:step" format
1181-
size_t colonPos = timeStartStr.find(':');
1182-
if (colonPos != std::string::npos)
1176+
VARIANT vtSequence;
1177+
VariantInit(&vtSequence);
1178+
if (SUCCEEDED(sequenceObj->GetIntrinsicValueAs(VT_UI8, &vtSequence)))
11831179
{
1184-
try
1185-
{
1186-
std::string sequenceStr = timeStartStr.substr(0, colonPos);
1187-
std::string stepStr = timeStartStr.substr(colonPos + 1);
1188-
1189-
// Handle hex format if present
1190-
if (sequenceStr.find("0x") == 0 || sequenceStr.find("0X") == 0)
1191-
event.timeStart.sequence = std::stoull(sequenceStr, nullptr, 16);
1192-
else
1193-
event.timeStart.sequence = std::stoull(sequenceStr, nullptr, 16); // TTD positions are typically hex
1194-
1195-
if (stepStr.find("0x") == 0 || stepStr.find("0X") == 0)
1196-
event.timeStart.step = std::stoull(stepStr, nullptr, 16);
1197-
else
1198-
event.timeStart.step = std::stoull(stepStr, nullptr, 16); // TTD positions are typically hex
1199-
}
1200-
catch (const std::exception& e)
1201-
{
1202-
LogWarn("Failed to parse TimeStart position: %s", timeStartStr.c_str());
1203-
}
1180+
event.timeStart.sequence = vtSequence.ullVal;
12041181
}
1182+
VariantClear(&vtSequence);
1183+
}
1184+
1185+
if (SUCCEEDED(timeStartObj->GetKeyValue(L"Steps", &stepsObj, nullptr)))
1186+
{
1187+
VARIANT vtSteps;
1188+
VariantInit(&vtSteps);
1189+
if (SUCCEEDED(stepsObj->GetIntrinsicValueAs(VT_UI8, &vtSteps)))
1190+
{
1191+
event.timeStart.step = vtSteps.ullVal;
1192+
}
1193+
VariantClear(&vtSteps);
12051194
}
1206-
VariantClear(&vtTimeStart);
12071195
}
12081196

12091197
// Parse TimeEnd
12101198
ComPtr<IModelObject> timeEndObj;
12111199
if (SUCCEEDED(callObject->GetKeyValue(L"TimeEnd", &timeEndObj, nullptr)))
12121200
{
1213-
VARIANT vtTimeEnd;
1214-
VariantInit(&vtTimeEnd);
1215-
if (SUCCEEDED(timeEndObj->GetIntrinsicValueAs(VT_BSTR, &vtTimeEnd)))
1201+
// TimeEnd is typically a TTD position object with Sequence and Steps
1202+
ComPtr<IModelObject> sequenceObj, stepsObj;
1203+
if (SUCCEEDED(timeEndObj->GetKeyValue(L"Sequence", &sequenceObj, nullptr)))
12161204
{
1217-
_bstr_t bstr(vtTimeEnd.bstrVal);
1218-
std::string timeEndStr = std::string(bstr);
1219-
1220-
// Handle "Max Position" case
1221-
if (timeEndStr.find("Max Position") != std::string::npos)
1205+
VARIANT vtSequence;
1206+
VariantInit(&vtSequence);
1207+
if (SUCCEEDED(sequenceObj->GetIntrinsicValueAs(VT_UI8, &vtSequence)))
12221208
{
1223-
event.timeEnd.sequence = UINT64_MAX;
1224-
event.timeEnd.step = UINT64_MAX;
1209+
event.timeEnd.sequence = vtSequence.ullVal;
12251210
}
1226-
else
1211+
VariantClear(&vtSequence);
1212+
}
1213+
1214+
if (SUCCEEDED(timeEndObj->GetKeyValue(L"Steps", &stepsObj, nullptr)))
1215+
{
1216+
VARIANT vtSteps;
1217+
VariantInit(&vtSteps);
1218+
if (SUCCEEDED(stepsObj->GetIntrinsicValueAs(VT_UI8, &vtSteps)))
12271219
{
1228-
// Parse "sequence:step" format
1229-
size_t colonPos = timeEndStr.find(':');
1230-
if (colonPos != std::string::npos)
1231-
{
1232-
try
1233-
{
1234-
std::string sequenceStr = timeEndStr.substr(0, colonPos);
1235-
std::string stepStr = timeEndStr.substr(colonPos + 1);
1236-
1237-
// Handle hex format if present
1238-
if (sequenceStr.find("0x") == 0 || sequenceStr.find("0X") == 0)
1239-
event.timeEnd.sequence = std::stoull(sequenceStr, nullptr, 16);
1240-
else
1241-
event.timeEnd.sequence = std::stoull(sequenceStr, nullptr, 16); // TTD positions are typically hex
1242-
1243-
if (stepStr.find("0x") == 0 || stepStr.find("0X") == 0)
1244-
event.timeEnd.step = std::stoull(stepStr, nullptr, 16);
1245-
else
1246-
event.timeEnd.step = std::stoull(stepStr, nullptr, 16); // TTD positions are typically hex
1247-
}
1248-
catch (const std::exception& e)
1249-
{
1250-
LogWarn("Failed to parse TimeEnd position: %s", timeEndStr.c_str());
1251-
}
1252-
}
1220+
event.timeEnd.step = vtSteps.ullVal;
12531221
}
1222+
VariantClear(&vtSteps);
12541223
}
1255-
VariantClear(&vtTimeEnd);
12561224
}
12571225

12581226
events.push_back(event);

0 commit comments

Comments
 (0)