* 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
This commit is contained in:
@@ -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()
|
||||
{
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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<TeamDebugModel> locker(fDebugModel);
|
||||
_UpdateRunButtons();
|
||||
|
||||
CpuState* cpuState = fActiveThread != NULL
|
||||
? fActiveThread->GetCpuState() : NULL;
|
||||
Reference<CpuState> cpuStateReference(cpuState);
|
||||
// hold a reference until the register view has one
|
||||
|
||||
StackTrace* stackTrace = fActiveThread != NULL
|
||||
? fActiveThread->GetStackTrace() : NULL;
|
||||
Reference<StackTrace> 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<CpuState> 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<TeamDebugModel> 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<TeamDebugModel> locker(fDebugModel);
|
||||
|
||||
CpuState* cpuState = fActiveThread != NULL
|
||||
? fActiveThread->GetCpuState() : NULL;
|
||||
Reference<CpuState> reference(cpuState);
|
||||
// hold a reference until the register view has one
|
||||
|
||||
locker.Unlock();
|
||||
|
||||
fRegisterView->SetCpuState(cpuState);
|
||||
_UpdateCpuState();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <String.h>
|
||||
#include <Window.h>
|
||||
|
||||
#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;
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user