Skip to content

Commit f68822c

Browse files
Copilotxusheng6
andcommitted
Address PR feedback: restore formatting, use dynamic column sizing, add event listener
Co-authored-by: xusheng6 <[email protected]>
1 parent e350faa commit f68822c

File tree

3 files changed

+49
-25
lines changed

3 files changed

+49
-25
lines changed

api/debuggerapi.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ namespace BinaryNinjaDebuggerAPI {
538538
uint64_t size; // Size of the module in bytes
539539
uint32_t checksum; // Checksum of the module
540540
uint32_t timestamp; // Timestamp of the module
541-
541+
542542
TTDModule() : address(0), size(0), checksum(0), timestamp(0) {}
543543
};
544544

@@ -551,7 +551,7 @@ namespace BinaryNinjaDebuggerAPI {
551551
TTDPosition lifetimeEnd; // Lifetime end position
552552
TTDPosition activeTimeStart; // Active time start position
553553
TTDPosition activeTimeEnd; // Active time end position
554-
554+
555555
TTDThread() : uniqueId(0), id(0) {}
556556
};
557557

@@ -571,7 +571,7 @@ namespace BinaryNinjaDebuggerAPI {
571571
uint32_t flags; // Exception flags
572572
uint64_t recordAddress; // Where in memory the exception record is found
573573
TTDPosition position; // Position where exception occurred
574-
574+
575575
TTDException() : type(TTDExceptionSoftware), programCounter(0), code(0), flags(0), recordAddress(0) {}
576576
};
577577

@@ -580,12 +580,12 @@ namespace BinaryNinjaDebuggerAPI {
580580
{
581581
TTDEventType type; // Type of event
582582
TTDPosition position; // Position where event occurred
583-
583+
584584
// Optional child objects - existence depends on event type
585585
std::optional<TTDModule> module; // For ModuleLoaded/ModuleUnloaded events
586586
std::optional<TTDThread> thread; // For ThreadCreated/ThreadTerminated events
587587
std::optional<TTDException> exception; // For Exception events
588-
588+
589589
TTDEvent() : type(TTDEventThreadCreated) {}
590590
TTDEvent(TTDEventType eventType) : type(eventType) {}
591591
};

ui/ttdheapwidget.cpp

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class NumericalTableWidgetItem : public QTableWidgetItem
4242

4343
// TTDHeapQueryWidget implementation
4444
TTDHeapQueryWidget::TTDHeapQueryWidget(QWidget* parent, BinaryViewRef data)
45-
: QWidget(parent), m_data(data)
45+
: QWidget(parent), m_data(data), m_hasPopulatedData(false)
4646
{
4747
m_controller = DebuggerController::GetController(m_data);
4848
if (!m_controller)
@@ -65,10 +65,22 @@ TTDHeapQueryWidget::TTDHeapQueryWidget(QWidget* parent, BinaryViewRef data)
6565

6666
setupUI();
6767
setupUIActions();
68+
69+
// Register for debugger events
70+
connect(this, &TTDHeapQueryWidget::debuggerEvent, this, &TTDHeapQueryWidget::onDebuggerEvent);
71+
72+
m_debuggerEventCallback = m_controller->RegisterEventCallback(
73+
[&](const DebuggerEvent& event) {
74+
emit debuggerEvent(event);
75+
},
76+
"TTD Heap Widget");
6877
}
6978

7079
TTDHeapQueryWidget::~TTDHeapQueryWidget()
7180
{
81+
if (m_controller)
82+
m_controller->RemoveEventCallback(m_debuggerEventCallback);
83+
7284
if (m_contextMenuManager)
7385
delete m_contextMenuManager;
7486
}
@@ -118,25 +130,6 @@ void TTDHeapQueryWidget::setupTable()
118130
m_resultsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
119131
m_resultsTable->setSortingEnabled(true);
120132
m_resultsTable->setContextMenuPolicy(Qt::CustomContextMenu);
121-
122-
// Set column widths
123-
m_resultsTable->setColumnWidth(IndexColumn, 80);
124-
m_resultsTable->setColumnWidth(EventTypeColumn, 100);
125-
m_resultsTable->setColumnWidth(ActionColumn, 100);
126-
m_resultsTable->setColumnWidth(TimeStartColumn, 120);
127-
m_resultsTable->setColumnWidth(TimeEndColumn, 120);
128-
m_resultsTable->setColumnWidth(HeapColumn, 120);
129-
m_resultsTable->setColumnWidth(AddressColumn, 120);
130-
m_resultsTable->setColumnWidth(PreviousAddressColumn, 120);
131-
m_resultsTable->setColumnWidth(SizeColumn, 100);
132-
m_resultsTable->setColumnWidth(BaseAddressColumn, 120);
133-
m_resultsTable->setColumnWidth(FlagsColumn, 100);
134-
m_resultsTable->setColumnWidth(ResultColumn, 100);
135-
m_resultsTable->setColumnWidth(ReserveSizeColumn, 100);
136-
m_resultsTable->setColumnWidth(CommitSizeColumn, 100);
137-
m_resultsTable->setColumnWidth(MakeReadOnlyColumn, 100);
138-
m_resultsTable->setColumnWidth(ThreadIdColumn, 100);
139-
m_resultsTable->setColumnWidth(UniqueThreadIdColumn, 120);
140133

141134
updateColumnVisibility();
142135

@@ -263,6 +256,12 @@ void TTDHeapQueryWidget::performQuery()
263256
m_resultsTable->setItem(i, ParametersColumn, new QTableWidgetItem(paramStrings.join(", ")));
264257
}
265258

259+
// Resize columns to fit contents after populating data
260+
m_resultsTable->resizeColumnsToContents();
261+
262+
// Mark that we have populated data
263+
m_hasPopulatedData = true;
264+
266265
updateStatus(QString("Found %1 heap objects").arg(events.size()));
267266
}
268267
catch (const std::exception& e)
@@ -277,6 +276,7 @@ void TTDHeapQueryWidget::performQuery()
277276
void TTDHeapQueryWidget::clearResults()
278277
{
279278
m_resultsTable->setRowCount(0);
279+
m_hasPopulatedData = false;
280280
updateStatus("Results cleared");
281281
}
282282

@@ -499,6 +499,22 @@ void TTDHeapQueryWidget::copyEntireTable()
499499
QApplication::clipboard()->setText(tableData.join("\n"));
500500
}
501501

502+
void TTDHeapQueryWidget::onDebuggerEvent(const DebuggerEvent& event)
503+
{
504+
switch (event.type)
505+
{
506+
case TargetStoppedEventType:
507+
// When the target stops, populate data if not already populated
508+
if (!m_hasPopulatedData && m_controller && m_controller->IsTTD())
509+
{
510+
performQuery();
511+
}
512+
break;
513+
default:
514+
break;
515+
}
516+
}
517+
502518
// TTDHeapWidget implementation (tab container)
503519
TTDHeapWidget::TTDHeapWidget(QWidget* parent, BinaryViewRef data)
504520
: QWidget(parent), m_data(data)

ui/ttdheapwidget.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ class TTDHeapQueryWidget : public QWidget
9898
ContextMenuManager* m_contextMenuManager;
9999
Menu* m_menu;
100100

101+
// Event callback
102+
size_t m_debuggerEventCallback;
103+
bool m_hasPopulatedData;
104+
101105
void setupUI();
102106
void setupTable();
103107
void updateStatus(const QString& message);
@@ -118,6 +122,9 @@ class TTDHeapQueryWidget : public QWidget
118122
// Method to check if this tab is unused (no results and default parameters)
119123
bool isUnused() const;
120124

125+
Q_SIGNALS:
126+
void debuggerEvent(const DebuggerEvent& event);
127+
121128
private Q_SLOTS:
122129
void clearResults();
123130
void onCellDoubleClicked(int row, int column);
@@ -128,6 +135,7 @@ private Q_SLOTS:
128135
void copySelectedCell();
129136
void copySelectedRow();
130137
void copyEntireTable();
138+
void onDebuggerEvent(const DebuggerEvent& event);
131139
};
132140

133141
class TTDHeapWidget : public QWidget

0 commit comments

Comments
 (0)