From c3edfca6e48b0b0634dec590238d02fd0642de2f Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 20 Jun 2009 19:26:47 +0000 Subject: [PATCH] * If a stack frame is selected show its registers instead those of the top frame. * Some cleanup in ThreadListView. * Unregister view listeners in the window destructor. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31147 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../gui/team_window/StackTraceView.cpp | 45 +++++++++-- .../debugger/gui/team_window/StackTraceView.h | 23 +++++- .../debugger/gui/team_window/TeamWindow.cpp | 74 ++++++++++++++----- .../debugger/gui/team_window/TeamWindow.h | 10 ++- .../gui/team_window/ThreadListView.cpp | 21 +++--- .../debugger/gui/team_window/ThreadListView.h | 3 +- 6 files changed, 138 insertions(+), 38 deletions(-) diff --git a/src/apps/debugger/gui/team_window/StackTraceView.cpp b/src/apps/debugger/gui/team_window/StackTraceView.cpp index 64c036a3c2..57f3a5d0f7 100644 --- a/src/apps/debugger/gui/team_window/StackTraceView.cpp +++ b/src/apps/debugger/gui/team_window/StackTraceView.cpp @@ -135,6 +135,11 @@ public: } } + StackFrame* FrameAt(int32 index) const + { + return fStackTrace != NULL ? fStackTrace->FrameAt(index) : NULL; + } + private: StackTrace* fStackTrace; }; @@ -143,11 +148,12 @@ private: // #pragma mark - StackTraceView -StackTraceView::StackTraceView() +StackTraceView::StackTraceView(Listener* listener) : BGroupView(B_VERTICAL), fFramesTable(NULL), - fFramesTableModel(NULL) + fFramesTableModel(NULL), + fListener(listener) { SetName("Stack Trace"); } @@ -162,9 +168,9 @@ StackTraceView::~StackTraceView() /*static*/ StackTraceView* -StackTraceView::Create() +StackTraceView::Create(Listener* listener) { - StackTraceView* self = new StackTraceView(); + StackTraceView* self = new StackTraceView(listener); try { self->_Init(); @@ -177,6 +183,13 @@ StackTraceView::Create() } +void +StackTraceView::UnsetListener() +{ + fListener = NULL; +} + + void StackTraceView::SetStackTrace(StackTrace* stackTrace) { @@ -195,6 +208,19 @@ StackTraceView::SetStackTrace(StackTrace* stackTrace) } +void +StackTraceView::TableSelectionChanged(Table* table) +{ + if (fListener == NULL) + return; + + StackFrame* frame + = fFramesTableModel->FrameAt(table->SelectionModel()->RowAt(0)); + + fListener->StackFrameSelectionChanged(frame); +} + + void StackTraceView::TableRowInvoked(Table* table, int32 rowIndex) { @@ -213,11 +239,20 @@ StackTraceView::_Init() 1000, B_TRUNCATE_END, B_ALIGN_RIGHT)); fFramesTable->AddColumn(new TargetAddressValueColumn(1, "IP", 80, 40, 1000, B_TRUNCATE_END, B_ALIGN_RIGHT)); - fFramesTable->AddColumn(new StringTableColumn(2, "Function", 80, 40, 1000, + fFramesTable->AddColumn(new StringTableColumn(2, "Function", 300, 100, 1000, B_TRUNCATE_END, B_ALIGN_LEFT)); fFramesTableModel = new FramesTableModel(); fFramesTable->SetTableModel(fFramesTableModel); + fFramesTable->SetSelectionMode(B_SINGLE_SELECTION_LIST); fFramesTable->AddTableListener(this); } + + +// #pragma mark - Listener + + +StackTraceView::Listener::~Listener() +{ +} diff --git a/src/apps/debugger/gui/team_window/StackTraceView.h b/src/apps/debugger/gui/team_window/StackTraceView.h index a55d56b97c..f7442e8e33 100644 --- a/src/apps/debugger/gui/team_window/StackTraceView.h +++ b/src/apps/debugger/gui/team_window/StackTraceView.h @@ -11,14 +11,22 @@ #include "Team.h" +class StackFrame; + + class StackTraceView : public BGroupView, private TableListener { public: - StackTraceView(); + class Listener; + +public: + StackTraceView(Listener* listener); ~StackTraceView(); - static StackTraceView* Create(); + static StackTraceView* Create(Listener* listener); // throws + void UnsetListener(); + void SetStackTrace(StackTrace* stackTrace); private: @@ -26,6 +34,7 @@ private: private: // TableListener + virtual void TableSelectionChanged(Table* table); virtual void TableRowInvoked(Table* table, int32 rowIndex); void _Init(); @@ -34,6 +43,16 @@ private: StackTrace* fStackTrace; Table* fFramesTable; FramesTableModel* fFramesTableModel; + Listener* fListener; +}; + + +class StackTraceView::Listener { +public: + virtual ~Listener(); + + virtual void StackFrameSelectionChanged( + StackFrame* frame) = 0; }; diff --git a/src/apps/debugger/gui/team_window/TeamWindow.cpp b/src/apps/debugger/gui/team_window/TeamWindow.cpp index a68cdea277..f5e8a6e889 100644 --- a/src/apps/debugger/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/gui/team_window/TeamWindow.cpp @@ -34,6 +34,7 @@ TeamWindow::TeamWindow(TeamDebugModel* debugModel, Listener* listener) B_ASYNCHRONOUS_CONTROLS), fDebugModel(debugModel), fActiveThread(NULL), + fActiveStackFrame(NULL), fListener(listener), fTabView(NULL), fLocalsTabView(NULL), @@ -58,6 +59,11 @@ TeamWindow::TeamWindow(TeamDebugModel* debugModel, Listener* listener) TeamWindow::~TeamWindow() { + if (fThreadListView != NULL) + fThreadListView->UnsetListener(); + if (fStackTraceView != NULL) + fStackTraceView->UnsetListener(); + fDebugModel->GetTeam()->RemoveListener(this); } @@ -143,6 +149,13 @@ TeamWindow::ThreadSelectionChanged(::Thread* thread) } +void +TeamWindow::StackFrameSelectionChanged(StackFrame* frame) +{ + _SetActiveStackFrame(frame); +} + + void TeamWindow::ThreadStateChanged(const Team::ThreadEvent& event) { @@ -197,7 +210,7 @@ TeamWindow::_Init() fTabView->AddTab(threadGroup); BLayoutBuilder::Split<>(threadGroup) .Add(fThreadListView = ThreadListView::Create(this)) - .Add(fStackTraceView = StackTraceView::Create()); + .Add(fStackTraceView = StackTraceView::Create(this)); // add images tab BSplitView* imagesGroup = new BSplitView(B_HORIZONTAL); @@ -243,11 +256,6 @@ TeamWindow::_SetActiveThread(::Thread* thread) AutoLocker locker(fDebugModel); _UpdateRunButtons(); - CpuState* cpuState = fActiveThread != NULL - ? fActiveThread->GetCpuState() : NULL; - Reference cpuStateReference(cpuState); - // hold a reference until the register view has one - StackTrace* stackTrace = fActiveThread != NULL ? fActiveThread->GetStackTrace() : NULL; Reference stackTraceReference(stackTrace); @@ -255,8 +263,49 @@ TeamWindow::_SetActiveThread(::Thread* thread) locker.Unlock(); - fRegisterView->SetCpuState(cpuState); fStackTraceView->SetStackTrace(stackTrace); + _UpdateCpuState(); +} + + +void +TeamWindow::_SetActiveStackFrame(StackFrame* frame) +{ + if (frame == fActiveStackFrame) + return; + + if (fActiveStackFrame != NULL) + fActiveStackFrame->RemoveReference(); + + fActiveStackFrame = frame; + + if (fActiveStackFrame != NULL) + fActiveStackFrame->AddReference(); + + _UpdateCpuState(); +} + + +void +TeamWindow::_UpdateCpuState() +{ + // get the CPU state + CpuState* cpuState = NULL; + Reference cpuStateReference; + // hold a reference until the register view has one + + if (fActiveThread != NULL) { + // Get the CPU state from the active stack frame or the thread directly. + if (fActiveStackFrame == NULL) { + AutoLocker locker(fDebugModel); + cpuState = fActiveThread->GetCpuState(); + cpuStateReference.SetTo(cpuState); + locker.Unlock(); + } else + cpuState = fActiveStackFrame->GetCpuState(); + } + + fRegisterView->SetCpuState(cpuState); } @@ -312,16 +361,7 @@ TeamWindow::_HandleCpuStateChanged(thread_id threadID) if (fActiveThread == NULL || threadID != fActiveThread->ID()) return; - AutoLocker locker(fDebugModel); - - CpuState* cpuState = fActiveThread != NULL - ? fActiveThread->GetCpuState() : NULL; - Reference reference(cpuState); - // hold a reference until the register view has one - - locker.Unlock(); - - fRegisterView->SetCpuState(cpuState); + _UpdateCpuState(); } diff --git a/src/apps/debugger/gui/team_window/TeamWindow.h b/src/apps/debugger/gui/team_window/TeamWindow.h index 3c97303668..3a6eda8c55 100644 --- a/src/apps/debugger/gui/team_window/TeamWindow.h +++ b/src/apps/debugger/gui/team_window/TeamWindow.h @@ -8,6 +8,7 @@ #include #include +#include "StackTraceView.h" #include "Team.h" #include "ThreadListView.h" @@ -16,12 +17,11 @@ class BButton; class BTabView; class ImageListView; class RegisterView; -class StackTraceView; class TeamDebugModel; class TeamWindow : public BWindow, private ThreadListView::Listener, - Team::Listener { + StackTraceView::Listener, Team::Listener { public: class Listener; @@ -41,6 +41,9 @@ private: // ThreadListView::Listener virtual void ThreadSelectionChanged(::Thread* thread); + // StackTraceView::Listener + virtual void StackFrameSelectionChanged(StackFrame* frame); + // Team::Listener virtual void ThreadStateChanged( const Team::ThreadEvent& event); @@ -52,6 +55,8 @@ private: void _Init(); void _SetActiveThread(::Thread* thread); + void _SetActiveStackFrame(StackFrame* frame); + void _UpdateCpuState(); void _UpdateRunButtons(); void _HandleThreadStateChanged(thread_id threadID); @@ -61,6 +66,7 @@ private: private: TeamDebugModel* fDebugModel; ::Thread* fActiveThread; + StackFrame* fActiveStackFrame; Listener* fListener; BTabView* fTabView; BTabView* fLocalsTabView; diff --git a/src/apps/debugger/gui/team_window/ThreadListView.cpp b/src/apps/debugger/gui/team_window/ThreadListView.cpp index 6b001867db..567be94ed9 100644 --- a/src/apps/debugger/gui/team_window/ThreadListView.cpp +++ b/src/apps/debugger/gui/team_window/ThreadListView.cpp @@ -165,6 +165,13 @@ ThreadListView::Create(Listener* listener) } +void +ThreadListView::UnsetListener() +{ + fListener = NULL; +} + + void ThreadListView::SetTeam(Team* team) { @@ -222,6 +229,9 @@ ThreadListView::ThreadRemoved(const Team::ThreadEvent& event) void ThreadListView::TableSelectionChanged(Table* table) { + if (fListener == NULL) + return; + Thread* thread = NULL; if (fThreadsTableModel != NULL) { TableSelectionModel* selectionModel = table->SelectionModel(); @@ -232,17 +242,6 @@ ThreadListView::TableSelectionChanged(Table* table) } -void -ThreadListView::TableRowInvoked(Table* table, int32 rowIndex) -{ -// if (fThreadsTableModel != NULL) { -// Thread* thread = fThreadsTableModel->ThreadAt(rowIndex); -// if (thread != NULL) -// fParent->OpenThreadWindow(thread); -// } -} - - void ThreadListView::_Init() { diff --git a/src/apps/debugger/gui/team_window/ThreadListView.h b/src/apps/debugger/gui/team_window/ThreadListView.h index 3d4f319006..e9d8a94771 100644 --- a/src/apps/debugger/gui/team_window/ThreadListView.h +++ b/src/apps/debugger/gui/team_window/ThreadListView.h @@ -26,6 +26,8 @@ public: static ThreadListView* Create(Listener* listener); // throws + void UnsetListener(); + void SetTeam(Team* team); virtual void MessageReceived(BMessage* message); @@ -40,7 +42,6 @@ private: // TableListener virtual void TableSelectionChanged(Table* table); - virtual void TableRowInvoked(Table* table, int32 rowIndex); void _Init();