Skip to content

Commit 2ec6938

Browse files
committed
Various fixes for TTD.Memory and TTD.Calls
1 parent 3cd71d7 commit 2ec6938

File tree

9 files changed

+31
-129
lines changed

9 files changed

+31
-129
lines changed

core/adapters/dbgengttdadapter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ namespace BinaryNinjaDebugger {
4747
bool Quit() override;
4848

4949
// TTD Memory Analysis Methods
50-
std::vector<TTDMemoryEvent> GetMemoryAccessForAddress(uint64_t startAddress, uint64_t endAddress, TTDMemoryAccessType accessType = TTDMemoryRead) override;
50+
std::vector<TTDMemoryEvent> GetTTDMemoryAccessForAddress(uint64_t startAddress, uint64_t endAddress, TTDMemoryAccessType accessType = TTDMemoryRead) override;
5151
TTDPosition GetCurrentTTDPosition() override;
5252
bool SetTTDPosition(const TTDPosition& position) override;
5353

core/debugadapter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ Ref<Settings> DebugAdapter::GetAdapterSettings()
179179

180180

181181
// TTD (Time Travel Debugging) default implementations
182-
std::vector<TTDMemoryEvent> DebugAdapter::GetMemoryAccessForAddress(uint64_t startAddress, uint64_t endAddress, TTDMemoryAccessType accessType)
182+
std::vector<TTDMemoryEvent> DebugAdapter::GetTTDMemoryAccessForAddress(uint64_t startAddress, uint64_t endAddress, TTDMemoryAccessType accessType)
183183
{
184184
// Default implementation returns empty results for adapters that don't support TTD
185185
return {};

core/debugadapter.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -309,11 +309,6 @@ namespace BinaryNinjaDebugger {
309309

310310
virtual bool SupportFeature(DebugAdapterCapacity feature) = 0;
311311

312-
// TTD (Time Travel Debugging) methods - provide default implementations that return empty results
313-
virtual std::vector<TTDMemoryEvent> GetMemoryAccessForAddress(uint64_t startAddress, uint64_t endAddress, TTDMemoryAccessType accessType = TTDMemoryRead);
314-
virtual TTDPosition GetCurrentTTDPosition();
315-
virtual bool SetTTDPosition(const TTDPosition& position);
316-
317312
// This is implemented by the (base) DebugAdapter class.
318313
// Sub-classes should use it to post debugger events directly (only when needed).
319314
void PostDebuggerEvent(const DebuggerEvent& event);

core/debuggercontroller.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2824,7 +2824,7 @@ std::vector<TTDMemoryEvent> DebuggerController::GetTTDMemoryAccessForAddress(uin
28242824

28252825
if (m_adapter)
28262826
{
2827-
events = m_adapter->GetMemoryAccessForAddress(startAddress, endAddress, accessType);
2827+
events = m_adapter->GetTTDMemoryAccessForAddress(startAddress, endAddress, accessType);
28282828
}
28292829

28302830
return events;

ui/ttdcallswidget.cpp

Lines changed: 13 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -322,10 +322,8 @@ void TTDCallsQueryWidget::onCellDoubleClicked(int row, int column)
322322
// Handle double-click events - navigate to addresses or time travel
323323
if (row < 0 || row >= m_resultsTable->rowCount())
324324
return;
325-
326-
LogicalColumn logicalCol = getLogicalColumnFromVisual(column);
327-
328-
if (logicalCol == TimeStartColumn || logicalCol == TimeEndColumn)
325+
326+
if (column == TimeStartColumn || column == TimeEndColumn)
329327
{
330328
// Handle time travel for both time start and time end columns
331329
QTableWidgetItem* timeItem = m_resultsTable->item(row, column);
@@ -349,25 +347,20 @@ void TTDCallsQueryWidget::onCellDoubleClicked(int row, int column)
349347
TTDPosition pos(sequence, step);
350348
if (m_controller->SetTTDPosition(pos))
351349
{
352-
// After time traveling, navigate to the function address
353-
int functionAddrVisualColumn = getVisualColumnFromLogical(FunctionAddressColumn);
354-
if (functionAddrVisualColumn >= 0)
350+
QTableWidgetItem* funcAddrItem = m_resultsTable->item(row, FunctionAddressColumn);
351+
if (funcAddrItem && m_data)
355352
{
356-
QTableWidgetItem* funcAddrItem = m_resultsTable->item(row, functionAddrVisualColumn);
357-
if (funcAddrItem && m_data)
353+
QString funcAddrStr = funcAddrItem->text();
354+
if (funcAddrStr.startsWith("0x", Qt::CaseInsensitive))
358355
{
359-
QString funcAddrStr = funcAddrItem->text();
360-
if (funcAddrStr.startsWith("0x", Qt::CaseInsensitive))
356+
bool ok;
357+
uint64_t funcAddress = funcAddrStr.mid(2).toULongLong(&ok, 16);
358+
if (ok)
361359
{
362-
bool ok;
363-
uint64_t funcAddress = funcAddrStr.mid(2).toULongLong(&ok, 16);
364-
if (ok)
360+
ViewFrame* frame = ViewFrame::viewFrameForWidget(this);
361+
if (frame)
365362
{
366-
ViewFrame* frame = ViewFrame::viewFrameForWidget(this);
367-
if (frame)
368-
{
369-
frame->navigate(m_data, funcAddress);
370-
}
363+
frame->navigate(m_data, funcAddress);
371364
}
372365
}
373366
}
@@ -377,7 +370,7 @@ void TTDCallsQueryWidget::onCellDoubleClicked(int row, int column)
377370
}
378371
}
379372
}
380-
else if (logicalCol == FunctionAddressColumn || logicalCol == ReturnAddressColumn)
373+
else if (column == FunctionAddressColumn || column == ReturnAddressColumn)
381374
{
382375
// Navigate to address in Binary Ninja
383376
QTableWidgetItem* item = m_resultsTable->item(row, column);
@@ -403,36 +396,6 @@ void TTDCallsQueryWidget::onCellDoubleClicked(int row, int column)
403396
}
404397
}
405398

406-
TTDCallsQueryWidget::LogicalColumn TTDCallsQueryWidget::getLogicalColumnFromVisual(int visualColumn) const
407-
{
408-
int logicalIndex = 0;
409-
for (int i = 0; i < m_columnVisibility.size(); ++i)
410-
{
411-
if (m_columnVisibility[i])
412-
{
413-
if (logicalIndex == visualColumn)
414-
return static_cast<LogicalColumn>(i);
415-
logicalIndex++;
416-
}
417-
}
418-
return IndexColumn; // fallback
419-
}
420-
421-
int TTDCallsQueryWidget::getVisualColumnFromLogical(LogicalColumn logicalColumn) const
422-
{
423-
int visualIndex = 0;
424-
for (int i = 0; i <= static_cast<int>(logicalColumn); ++i)
425-
{
426-
if (m_columnVisibility[i])
427-
{
428-
if (i == static_cast<int>(logicalColumn))
429-
return visualIndex;
430-
visualIndex++;
431-
}
432-
}
433-
return -1; // not visible
434-
}
435-
436399
void TTDCallsQueryWidget::updateColumnVisibility()
437400
{
438401
// Apply column visibility settings

ui/ttdcallswidget.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,6 @@ class TTDCallsQueryWidget : public QWidget
9494
void setupContextMenu();
9595
void updateColumnVisibility();
9696

97-
// Helper method to map visual column index to logical column
98-
LogicalColumn getLogicalColumnFromVisual(int visualColumn) const;
99-
// Helper method to get visual column index from logical column
100-
int getVisualColumnFromLogical(LogicalColumn logicalColumn) const;
101-
10297
public:
10398
TTDCallsQueryWidget(QWidget* parent, BinaryViewRef data);
10499
virtual ~TTDCallsQueryWidget();

ui/ttdmemorywidget.cpp

Lines changed: 14 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -300,43 +300,6 @@ void TTDMemoryQueryWidget::updateColumnVisibility()
300300
}
301301
}
302302

303-
TTDMemoryQueryWidget::LogicalColumn TTDMemoryQueryWidget::getLogicalColumnFromVisual(int visualColumn) const
304-
{
305-
if (visualColumn < 0 || visualColumn >= m_resultsTable->columnCount())
306-
return static_cast<LogicalColumn>(-1); // Invalid
307-
308-
int currentVisualIndex = 0;
309-
for (int logicalIndex = 0; logicalIndex < m_columnVisibility.size(); ++logicalIndex)
310-
{
311-
if (m_columnVisibility[logicalIndex]) // Column is visible
312-
{
313-
if (currentVisualIndex == visualColumn)
314-
return static_cast<LogicalColumn>(logicalIndex);
315-
currentVisualIndex++;
316-
}
317-
}
318-
319-
return static_cast<LogicalColumn>(-1); // Not found
320-
}
321-
322-
int TTDMemoryQueryWidget::getVisualColumnFromLogical(LogicalColumn logicalColumn) const
323-
{
324-
if (logicalColumn < 0 || logicalColumn >= m_columnVisibility.size())
325-
return -1; // Invalid
326-
327-
if (!m_columnVisibility[logicalColumn])
328-
return -1; // Column is hidden
329-
330-
int visualIndex = 0;
331-
for (int i = 0; i < logicalColumn; ++i)
332-
{
333-
if (m_columnVisibility[i]) // Column is visible
334-
visualIndex++;
335-
}
336-
337-
return visualIndex;
338-
}
339-
340303
void TTDMemoryQueryWidget::performQuery()
341304
{
342305
if (!m_controller || !m_controller->IsTTD())
@@ -458,15 +421,11 @@ void TTDMemoryQueryWidget::onCellDoubleClicked(int row, int column)
458421
// Handle double-click events - navigate to address or position
459422
if (row < 0 || row >= m_resultsTable->rowCount())
460423
return;
461-
462-
// Get the logical column type from the visual column index
463-
LogicalColumn logicalColumn = getLogicalColumnFromVisual(column);
464-
465-
if (logicalColumn == TimeStartColumn)
424+
425+
if (column == TimeStartColumn || column == TimeEndColumn)
466426
{
467427
// Parse position and navigate to it
468-
int timeStartVisualColumn = getVisualColumnFromLogical(TimeStartColumn);
469-
QTableWidgetItem* posItem = m_resultsTable->item(row, timeStartVisualColumn);
428+
QTableWidgetItem* posItem = m_resultsTable->item(row, column);
470429
if (posItem && m_controller)
471430
{
472431
QString posStr = posItem->text();
@@ -482,25 +441,20 @@ void TTDMemoryQueryWidget::onCellDoubleClicked(int row, int column)
482441
TTDPosition pos(sequence, step);
483442
if (m_controller->SetTTDPosition(pos))
484443
{
485-
// After time traveling, also navigate to the instruction pointer
486-
int ipVisualColumn = getVisualColumnFromLogical(IPColumn);
487-
if (ipVisualColumn >= 0)
444+
QTableWidgetItem* ipItem = m_resultsTable->item(row, IPColumn);
445+
if (ipItem && m_data)
488446
{
489-
QTableWidgetItem* ipItem = m_resultsTable->item(row, ipVisualColumn);
490-
if (ipItem && m_data)
447+
QString ipStr = ipItem->text();
448+
if (ipStr.startsWith("0x", Qt::CaseInsensitive))
491449
{
492-
QString ipStr = ipItem->text();
493-
if (ipStr.startsWith("0x", Qt::CaseInsensitive))
450+
bool ok;
451+
uint64_t ipAddress = ipStr.mid(2).toULongLong(&ok, 16);
452+
if (ok)
494453
{
495-
bool ok;
496-
uint64_t ipAddress = ipStr.mid(2).toULongLong(&ok, 16);
497-
if (ok)
454+
ViewFrame* frame = ViewFrame::viewFrameForWidget(this);
455+
if (frame)
498456
{
499-
ViewFrame* frame = ViewFrame::viewFrameForWidget(this);
500-
if (frame)
501-
{
502-
frame->navigate(m_data, ipAddress);
503-
}
457+
frame->navigate(m_data, ipAddress);
504458
}
505459
}
506460
}
@@ -515,7 +469,7 @@ void TTDMemoryQueryWidget::onCellDoubleClicked(int row, int column)
515469
}
516470
}
517471
}
518-
else if (logicalColumn == AddressColumn || logicalColumn == IPColumn)
472+
else if (column == AddressColumn || column == IPColumn)
519473
{
520474
// Navigate to address in disassembly view
521475
QTableWidgetItem* addrItem = m_resultsTable->item(row, column);

ui/ttdmemorywidget.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,6 @@ class TTDMemoryQueryWidget : public QWidget
111111
void setupContextMenu();
112112
void updateColumnVisibility();
113113

114-
// Helper method to map visual column index to logical column
115-
LogicalColumn getLogicalColumnFromVisual(int visualColumn) const;
116-
// Helper method to get visual column index from logical column
117-
int getVisualColumnFromLogical(LogicalColumn logicalColumn) const;
118-
119114
public:
120115
TTDMemoryQueryWidget(QWidget* parent, BinaryViewRef data);
121116
virtual ~TTDMemoryQueryWidget();

ui/ui.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ limitations under the License.
4141
#include "progresstask.h"
4242
#include "debuggerinfowidget.h"
4343
#include "ttdmemorywidget.h"
44+
#include "ttdcallswidget.h"
4445
#include "freeversion.h"
4546
#include <QTimer>
4647

4748
#ifdef WIN32
4849
#include "ttdrecord.h"
49-
#include "ttdcallswidget.h"
5050
#include "scriptingconsole.h"
5151
#endif
5252

0 commit comments

Comments
 (0)