Skip to content

Commit 8d5d481

Browse files
Copilotxusheng6
andcommitted
Implement UI improvements and TTDEventTypeFlags: separate Name/Path columns, hide checksum/timestamp, improve event type display, add flags-based filtering API
Co-authored-by: xusheng6 <[email protected]>
1 parent b705e45 commit 8d5d481

File tree

9 files changed

+65
-25
lines changed

9 files changed

+65
-25
lines changed

api/debuggerapi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,7 @@ namespace BinaryNinjaDebuggerAPI {
758758
// TTD Memory Analysis Methods
759759
std::vector<TTDMemoryEvent> GetTTDMemoryAccessForAddress(uint64_t address, uint64_t size, TTDMemoryAccessType accessType = TTDMemoryRead);
760760
std::vector<TTDCallEvent> GetTTDCallsForSymbols(const std::string& symbols, uint64_t startReturnAddress = 0, uint64_t endReturnAddress = 0);
761-
std::vector<TTDEvent> GetTTDEvents(TTDEventType eventType);
761+
std::vector<TTDEvent> GetTTDEvents(TTDEventTypeFlags eventTypes);
762762
std::vector<TTDEvent> GetAllTTDEvents();
763763
TTDPosition GetCurrentTTDPosition();
764764
bool SetTTDPosition(const TTDPosition& position);

core/adapters/dbgengttdadapter.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,7 +1364,7 @@ bool DbgEngTTDAdapter::ParseTTDCallObjects(const std::string& expression, std::v
13641364
}
13651365

13661366

1367-
std::vector<TTDEvent> DbgEngTTDAdapter::GetTTDEvents(TTDEventType eventType)
1367+
std::vector<TTDEvent> DbgEngTTDAdapter::GetTTDEvents(TTDEventTypeFlags eventTypes)
13681368
{
13691369
std::vector<TTDEvent> events;
13701370

@@ -1378,16 +1378,37 @@ std::vector<TTDEvent> DbgEngTTDAdapter::GetTTDEvents(TTDEventType eventType)
13781378
}
13791379
}
13801380

1381-
// Filter cached events by type
1381+
// Filter cached events by type flags
13821382
for (const auto& event : m_cachedEvents)
13831383
{
1384-
if (event.type == eventType)
1384+
bool matchesFilter = false;
1385+
1386+
switch (event.type)
1387+
{
1388+
case TTDEventThreadCreated:
1389+
matchesFilter = (eventTypes & TTDEventThreadCreated_Flag) != 0;
1390+
break;
1391+
case TTDEventThreadTerminated:
1392+
matchesFilter = (eventTypes & TTDEventThreadTerminated_Flag) != 0;
1393+
break;
1394+
case TTDEventModuleLoaded:
1395+
matchesFilter = (eventTypes & TTDEventModuleLoaded_Flag) != 0;
1396+
break;
1397+
case TTDEventModuleUnloaded:
1398+
matchesFilter = (eventTypes & TTDEventModuleUnloaded_Flag) != 0;
1399+
break;
1400+
case TTDEventException:
1401+
matchesFilter = (eventTypes & TTDEventException_Flag) != 0;
1402+
break;
1403+
}
1404+
1405+
if (matchesFilter)
13851406
{
13861407
events.push_back(event);
13871408
}
13881409
}
13891410

1390-
LogInfo("Successfully retrieved %zu TTD events of type %d from cache", events.size(), eventType);
1411+
LogInfo("Successfully retrieved %zu TTD events with flags %d from cache", events.size(), eventTypes);
13911412
return events;
13921413
}
13931414

core/adapters/dbgengttdadapter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ namespace BinaryNinjaDebugger {
5555
std::vector<TTDCallEvent> GetTTDCallsForSymbols(const std::string& symbols, uint64_t startReturnAddress = 0, uint64_t endReturnAddress = 0) override;
5656

5757
// TTD Events Analysis Methods
58-
std::vector<TTDEvent> GetTTDEvents(TTDEventType eventType) override;
58+
std::vector<TTDEvent> GetTTDEvents(TTDEventTypeFlags eventTypes) override;
5959
std::vector<TTDEvent> GetAllTTDEvents() override;
6060

6161
void GenerateDefaultAdapterSettings(BinaryView* data);

core/debugadapter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ std::vector<TTDCallEvent> DebugAdapter::GetTTDCallsForSymbols(const std::string&
193193
}
194194

195195

196-
std::vector<TTDEvent> DebugAdapter::GetTTDEvents(TTDEventType eventType)
196+
std::vector<TTDEvent> DebugAdapter::GetTTDEvents(TTDEventTypeFlags eventTypes)
197197
{
198198
// Default implementation returns empty results for adapters that don't support TTD
199199
return {};

core/debugadapter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ namespace BinaryNinjaDebugger {
330330
// TTD (Time Travel Debugging) methods - default implementations return empty results
331331
virtual std::vector<TTDMemoryEvent> GetTTDMemoryAccessForAddress(uint64_t startAddress, uint64_t endAddress, TTDMemoryAccessType accessType = TTDMemoryRead);
332332
virtual std::vector<TTDCallEvent> GetTTDCallsForSymbols(const std::string& symbols, uint64_t startReturnAddress = 0, uint64_t endReturnAddress = 0);
333-
virtual std::vector<TTDEvent> GetTTDEvents(TTDEventType eventType);
333+
virtual std::vector<TTDEvent> GetTTDEvents(TTDEventTypeFlags eventTypes);
334334
virtual std::vector<TTDEvent> GetAllTTDEvents();
335335
virtual TTDPosition GetCurrentTTDPosition();
336336
virtual bool SetTTDPosition(const TTDPosition& position);

core/debuggercommon.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,18 @@ namespace BinaryNinjaDebugger {
164164
TTDEventException
165165
};
166166

167+
// TTD Event Type Flags - can be combined using bitwise OR
168+
enum TTDEventTypeFlags
169+
{
170+
TTDEventNone = 0,
171+
TTDEventThreadCreated_Flag = 1,
172+
TTDEventThreadTerminated_Flag = 2,
173+
TTDEventModuleLoaded_Flag = 4,
174+
TTDEventModuleUnloaded_Flag = 8,
175+
TTDEventException_Flag = 16,
176+
TTDEventAll = TTDEventThreadCreated_Flag | TTDEventThreadTerminated_Flag | TTDEventModuleLoaded_Flag | TTDEventModuleUnloaded_Flag | TTDEventException_Flag
177+
};
178+
167179
// TTD Module - information about modules that were loaded/unloaded during trace
168180
struct TTDModule
169181
{

core/debuggercontroller.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2902,7 +2902,7 @@ std::vector<TTDCallEvent> DebuggerController::GetTTDCallsForSymbols(const std::s
29022902
}
29032903

29042904

2905-
std::vector<TTDEvent> DebuggerController::GetTTDEvents(TTDEventType eventType)
2905+
std::vector<TTDEvent> DebuggerController::GetTTDEvents(TTDEventTypeFlags eventTypes)
29062906
{
29072907
std::vector<TTDEvent> events;
29082908

@@ -2912,7 +2912,7 @@ std::vector<TTDEvent> DebuggerController::GetTTDEvents(TTDEventType eventType)
29122912
return events;
29132913
}
29142914

2915-
return m_adapter->GetTTDEvents(eventType);
2915+
return m_adapter->GetTTDEvents(eventTypes);
29162916
}
29172917

29182918

core/debuggercontroller.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ namespace BinaryNinjaDebugger {
364364
// TTD Memory Analysis Methods
365365
std::vector<TTDMemoryEvent> GetTTDMemoryAccessForAddress(uint64_t startAddress, uint64_t endAddress, TTDMemoryAccessType accessType = TTDMemoryRead);
366366
std::vector<TTDCallEvent> GetTTDCallsForSymbols(const std::string& symbols, uint64_t startReturnAddress = 0, uint64_t endReturnAddress = 0);
367-
std::vector<TTDEvent> GetTTDEvents(TTDEventType eventType);
367+
std::vector<TTDEvent> GetTTDEvents(TTDEventTypeFlags eventTypes);
368368
std::vector<TTDEvent> GetAllTTDEvents();
369369
TTDPosition GetCurrentTTDPosition();
370370
bool SetTTDPosition(const TTDPosition& position);

ui/ttdeventswidget.cpp

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ limitations under the License.
2727
#include <QToolButton>
2828
#include <QPropertyAnimation>
2929
#include <QFrame>
30+
#include <QFileInfo>
3031
#include <map>
3132

3233
// TTDEventsColumnVisibilityDialog implementation
@@ -213,16 +214,17 @@ void TTDEventsQueryWidget::setupTable()
213214
switch (m_widgetType)
214215
{
215216
case ModuleEvents:
216-
m_columnNames << "Index" << "Position" << "Event Type" << "Module Name"
217-
<< "Module Address" << "Module Size" << "Module Checksum" << "Module Timestamp";
217+
m_columnNames << "Index" << "Position" << "Event Type" << "Name"
218+
<< "Module Address" << "Module Size" << "Module Checksum" << "Module Timestamp" << "Path";
218219
m_columnVisibility << true // Index
219220
<< true // Position
220221
<< true // Event Type
221-
<< true // Module Name
222+
<< true // Name
222223
<< true // Module Address
223224
<< true // Module Size
224-
<< true // Module Checksum
225-
<< true; // Module Timestamp
225+
<< false // Module Checksum (hidden by default)
226+
<< false // Module Timestamp (hidden by default)
227+
<< true; // Path (moved to last column)
226228
break;
227229

228230
case ThreadEvents:
@@ -577,29 +579,34 @@ void TTDEventsQueryWidget::filterAndDisplaySpecializedEvents()
577579
switch (m_widgetType)
578580
{
579581
case ModuleEvents:
580-
// Position, Event Type, Module Name, Module Address, Module Size, Module Checksum, Module Timestamp
582+
// Position, Event Type, Name (base name), Module Address, Module Size, Module Checksum, Module Timestamp, Path (full path)
581583
{
582584
QString positionStr = QString("%1:%2").arg(event.position.sequence, 0, 16).arg(event.position.step, 0, 16);
583585
m_resultsTable->setItem(i, col++, new QTableWidgetItem(positionStr));
584586

585-
QString eventTypeStr = (event.type == TTDEventModuleLoaded) ? "ModuleLoaded" : "ModuleUnloaded";
587+
QString eventTypeStr = (event.type == TTDEventModuleLoaded) ? "Loaded" : "Unloaded";
586588
m_resultsTable->setItem(i, col++, new QTableWidgetItem(eventTypeStr));
587589

588590
if (event.module.has_value())
589591
{
590-
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString::fromStdString(event.module->name)));
592+
// Extract base name from full path
593+
QString fullPath = QString::fromStdString(event.module->name);
594+
QString baseName = QFileInfo(fullPath).fileName();
595+
if (baseName.isEmpty())
596+
baseName = fullPath; // fallback to full path if no filename
597+
598+
m_resultsTable->setItem(i, col++, new QTableWidgetItem(baseName));
591599
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString("0x%1").arg(event.module->address, 0, 16)));
592600
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString::number(event.module->size)));
593601
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString("0x%1").arg(event.module->checksum, 0, 16)));
594602
m_resultsTable->setItem(i, col++, new QTableWidgetItem(QString("0x%1").arg(event.module->timestamp, 0, 16)));
603+
m_resultsTable->setItem(i, col++, new QTableWidgetItem(fullPath)); // Full path in last column
595604
}
596605
else
597606
{
598-
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
599-
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
600-
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
601-
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
602-
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
607+
// Fill empty cells for all module columns
608+
for (int j = 0; j < 6; j++)
609+
m_resultsTable->setItem(i, col++, new QTableWidgetItem(""));
603610
}
604611
}
605612
break;
@@ -610,7 +617,7 @@ void TTDEventsQueryWidget::filterAndDisplaySpecializedEvents()
610617
QString positionStr = QString("%1:%2").arg(event.position.sequence, 0, 16).arg(event.position.step, 0, 16);
611618
m_resultsTable->setItem(i, col++, new QTableWidgetItem(positionStr));
612619

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

616623
if (event.thread.has_value())

0 commit comments

Comments
 (0)