Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 53 additions & 44 deletions ui/ttdeventswidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ limitations under the License.
#include <QFileInfo>
#include <map>

static uint64_t PositionSortValue(const TTDPosition& position)
{
return (position.sequence << 32) | (position.step & 0xFFFFFFFF);
}

// TTDEventsColumnVisibilityDialog implementation
TTDEventsColumnVisibilityDialog::TTDEventsColumnVisibilityDialog(QWidget* parent, const QStringList& columnNames, const QList<bool>& visibility)
: QDialog(parent)
Expand Down Expand Up @@ -457,7 +462,7 @@ void TTDEventsQueryWidget::filterAndDisplayEvents()
const TTDEvent& event = filteredEvents[i];

// Index
m_resultsTable->setItem(i, IndexColumn, new QTableWidgetItem(QString::number(i + 1)));
m_resultsTable->setItem(i, IndexColumn, new NumericalTableWidgetItem(QString::number(i + 1), i + 1));

// Event Type
QString eventTypeStr;
Expand Down Expand Up @@ -486,47 +491,47 @@ void TTDEventsQueryWidget::filterAndDisplayEvents()

// Position
QString positionStr = QString("%1:%2").arg(event.position.sequence, 0, 16).arg(event.position.step, 0, 16);
m_resultsTable->setItem(i, PositionColumn, new QTableWidgetItem(positionStr));
m_resultsTable->setItem(i, PositionColumn, new NumericalTableWidgetItem(positionStr, PositionSortValue(event.position)));

// Thread details (if available)
if (event.thread.has_value())
{
m_resultsTable->setItem(i, ThreadIdColumn, new QTableWidgetItem(QString::number(event.thread->id)));
m_resultsTable->setItem(i, ThreadUniqueIdColumn, new QTableWidgetItem(QString::number(event.thread->uniqueId)));
m_resultsTable->setItem(i, ThreadIdColumn, new NumericalTableWidgetItem(QString::number(event.thread->id), event.thread->id));
m_resultsTable->setItem(i, ThreadUniqueIdColumn, new NumericalTableWidgetItem(QString::number(event.thread->uniqueId), event.thread->uniqueId));
}
else
{
m_resultsTable->setItem(i, ThreadIdColumn, new QTableWidgetItem(""));
m_resultsTable->setItem(i, ThreadUniqueIdColumn, new QTableWidgetItem(""));
m_resultsTable->setItem(i, ThreadIdColumn, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, ThreadUniqueIdColumn, new NumericalTableWidgetItem("", 0));
}

// Module details (if available)
if (event.module.has_value())
{
m_resultsTable->setItem(i, ModuleNameColumn, new QTableWidgetItem(QString::fromStdString(event.module->name)));
m_resultsTable->setItem(i, ModuleAddressColumn, new QTableWidgetItem(QString("0x%1").arg(event.module->address, 0, 16)));
m_resultsTable->setItem(i, ModuleSizeColumn, new QTableWidgetItem(QString::number(event.module->size)));
m_resultsTable->setItem(i, ModuleAddressColumn, new NumericalTableWidgetItem(QString("0x%1").arg(event.module->address, 0, 16), event.module->address));
m_resultsTable->setItem(i, ModuleSizeColumn, new NumericalTableWidgetItem(QString::number(event.module->size), event.module->size));
}
else
{
m_resultsTable->setItem(i, ModuleNameColumn, new QTableWidgetItem(""));
m_resultsTable->setItem(i, ModuleAddressColumn, new QTableWidgetItem(""));
m_resultsTable->setItem(i, ModuleSizeColumn, new QTableWidgetItem(""));
m_resultsTable->setItem(i, ModuleAddressColumn, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, ModuleSizeColumn, new NumericalTableWidgetItem("", 0));
}

// Exception details (if available)
if (event.exception.has_value())
{
QString exceptionTypeStr = (event.exception->type == TTDExceptionHardware) ? "Hardware" : "Software";
m_resultsTable->setItem(i, ExceptionTypeColumn, new QTableWidgetItem(exceptionTypeStr));
m_resultsTable->setItem(i, ExceptionCodeColumn, new QTableWidgetItem(QString("0x%1").arg(event.exception->code, 0, 16)));
m_resultsTable->setItem(i, ExceptionPCColumn, new QTableWidgetItem(QString("0x%1").arg(event.exception->programCounter, 0, 16)));
m_resultsTable->setItem(i, ExceptionCodeColumn, new NumericalTableWidgetItem(QString("0x%1").arg(event.exception->code, 0, 16), event.exception->code));
m_resultsTable->setItem(i, ExceptionPCColumn, new NumericalTableWidgetItem(QString("0x%1").arg(event.exception->programCounter, 0, 16), event.exception->programCounter));
}
else
{
m_resultsTable->setItem(i, ExceptionTypeColumn, new QTableWidgetItem(""));
m_resultsTable->setItem(i, ExceptionCodeColumn, new QTableWidgetItem(""));
m_resultsTable->setItem(i, ExceptionPCColumn, new QTableWidgetItem(""));
m_resultsTable->setItem(i, ExceptionCodeColumn, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, ExceptionPCColumn, new NumericalTableWidgetItem("", 0));
}
}

Expand Down Expand Up @@ -581,15 +586,15 @@ void TTDEventsQueryWidget::filterAndDisplaySpecializedEvents()
int col = 0;

// Index (always first column)
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString::number(i + 1)));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString::number(i + 1), i + 1));

switch (m_widgetType)
{
case ModuleEvents:
// Position, Event Type, Name (base name), Module Address, Module Size, Module Checksum, Module Timestamp, Path (full path)
{
QString positionStr = QString("%1:%2").arg(event.position.sequence, 0, 16).arg(event.position.step, 0, 16);
m_resultsTable->setItem(i, col++, new QTableWidgetItem(positionStr));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(positionStr, PositionSortValue(event.position)));

QString eventTypeStr = (event.type == TTDEventModuleLoaded) ? "Loaded" : "Unloaded";
m_resultsTable->setItem(i, col++, new QTableWidgetItem(eventTypeStr));
Expand All @@ -603,17 +608,21 @@ void TTDEventsQueryWidget::filterAndDisplaySpecializedEvents()
baseName = fullPath; // fallback to full path if no filename

m_resultsTable->setItem(i, col++, new QTableWidgetItem(baseName));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString("0x%1").arg(event.module->address, 0, 16)));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString::number(event.module->size)));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString("0x%1").arg(event.module->checksum, 0, 16)));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString("0x%1").arg(event.module->timestamp, 0, 16)));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString("0x%1").arg(event.module->address, 0, 16), event.module->address));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString::number(event.module->size), event.module->size));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString("0x%1").arg(event.module->checksum, 0, 16), event.module->checksum));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString("0x%1").arg(event.module->timestamp, 0, 16), event.module->timestamp));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(fullPath)); // Full path in last column
}
else
{
// Fill empty cells for all module columns
for (int j = 0; j < 6; j++)
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
}
}
break;
Expand All @@ -622,36 +631,36 @@ void TTDEventsQueryWidget::filterAndDisplaySpecializedEvents()
// Position, Event Type, Thread ID, Thread UniqueID, Lifetime Start, Lifetime End, Active Start, Active End
{
QString positionStr = QString("%1:%2").arg(event.position.sequence, 0, 16).arg(event.position.step, 0, 16);
m_resultsTable->setItem(i, col++, new QTableWidgetItem(positionStr));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(positionStr, PositionSortValue(event.position)));

QString eventTypeStr = (event.type == TTDEventThreadCreated) ? "Created" : "Terminated";
m_resultsTable->setItem(i, col++, new QTableWidgetItem(eventTypeStr));

if (event.thread.has_value())
{
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString::number(event.thread->id)));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString::number(event.thread->uniqueId)));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString::number(event.thread->id), event.thread->id));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString::number(event.thread->uniqueId), event.thread->uniqueId));

// Lifetime range
QString lifetimeStart = QString("%1:%2").arg(event.thread->lifetimeStart.sequence, 0, 16).arg(event.thread->lifetimeStart.step, 0, 16);
QString lifetimeEnd = QString("%1:%2").arg(event.thread->lifetimeEnd.sequence, 0, 16).arg(event.thread->lifetimeEnd.step, 0, 16);
m_resultsTable->setItem(i, col++, new QTableWidgetItem(lifetimeStart));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(lifetimeEnd));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(lifetimeStart, PositionSortValue(event.thread->lifetimeStart)));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(lifetimeEnd, PositionSortValue(event.thread->lifetimeEnd)));

// Active time range
QString activeStart = QString("%1:%2").arg(event.thread->activeTimeStart.sequence, 0, 16).arg(event.thread->activeTimeStart.step, 0, 16);
QString activeEnd = QString("%1:%2").arg(event.thread->activeTimeEnd.sequence, 0, 16).arg(event.thread->activeTimeEnd.step, 0, 16);
m_resultsTable->setItem(i, col++, new QTableWidgetItem(activeStart));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(activeEnd));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(activeStart, PositionSortValue(event.thread->activeTimeStart)));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(activeEnd, PositionSortValue(event.thread->activeTimeEnd)));
}
else
{
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
}
}
break;
Expand All @@ -660,24 +669,24 @@ void TTDEventsQueryWidget::filterAndDisplaySpecializedEvents()
// Position, Exception Type, Program Counter, Exception Code, Exception Flags, Record Address
{
QString positionStr = QString("%1:%2").arg(event.position.sequence, 0, 16).arg(event.position.step, 0, 16);
m_resultsTable->setItem(i, col++, new QTableWidgetItem(positionStr));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(positionStr, PositionSortValue(event.position)));

if (event.exception.has_value())
{
QString exceptionTypeStr = (event.exception->type == TTDExceptionHardware) ? "Hardware" : "Software";
m_resultsTable->setItem(i, col++, new QTableWidgetItem(exceptionTypeStr));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString("0x%1").arg(event.exception->programCounter, 0, 16)));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString("0x%1").arg(event.exception->code, 0, 16)));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString("0x%1").arg(event.exception->flags, 0, 16)));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString("0x%1").arg(event.exception->recordAddress, 0, 16)));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString("0x%1").arg(event.exception->programCounter, 0, 16), event.exception->programCounter));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString("0x%1").arg(event.exception->code, 0, 16), event.exception->code));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString("0x%1").arg(event.exception->flags, 0, 16), event.exception->flags));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem(QString("0x%1").arg(event.exception->recordAddress, 0, 16), event.exception->recordAddress));
}
else
{
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
m_resultsTable->setItem(i, col++, new NumericalTableWidgetItem("", 0));
}
}
break;
Expand Down