mirror of https://github.com/PCSX2/pcsx2.git
Add thread list to debugger
This commit is contained in:
parent
5f7a3a8ca9
commit
1e3e5c92a8
|
@ -410,14 +410,6 @@ void BreakpointList::removeBreakpoint(int itemIndex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakpointList::postEvent(wxEventType type, int value)
|
|
||||||
{
|
|
||||||
wxCommandEvent event( type, GetId() );
|
|
||||||
event.SetEventObject(this);
|
|
||||||
event.SetInt(value);
|
|
||||||
wxPostEvent(this,event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BreakpointList::onPopupClick(wxCommandEvent& evt)
|
void BreakpointList::onPopupClick(wxCommandEvent& evt)
|
||||||
{
|
{
|
||||||
int index = GetFirstSelected();
|
int index = GetFirstSelected();
|
||||||
|
@ -475,3 +467,135 @@ void BreakpointList::onDoubleClick(int itemIndex, const wxPoint& point)
|
||||||
{
|
{
|
||||||
gotoBreakpointAddress(itemIndex);
|
gotoBreakpointAddress(itemIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// ThreadList
|
||||||
|
//
|
||||||
|
|
||||||
|
enum { TL_TID, TL_PROGRAMCOUNTER, TL_ENTRYPOINT, TL_PRIORITY, TL_STATE, TL_WAITTYPE, TL_COLUMNCOUNT };
|
||||||
|
|
||||||
|
GenericListViewColumn threadColumns[TL_COLUMNCOUNT] = {
|
||||||
|
{ L"TID", 0.08f },
|
||||||
|
{ L"PC", 0.21f },
|
||||||
|
{ L"Entry Point", 0.21f },
|
||||||
|
{ L"Priority", 0.08f },
|
||||||
|
{ L"State", 0.21f },
|
||||||
|
{ L"Wait type", 0.21f },
|
||||||
|
};
|
||||||
|
|
||||||
|
ThreadList::ThreadList(wxWindow* parent, DebugInterface* _cpu)
|
||||||
|
: GenericListView(parent,threadColumns,TL_COLUMNCOUNT), cpu(_cpu)
|
||||||
|
{
|
||||||
|
#ifdef __linux__
|
||||||
|
// On linux wx failed to resize properly the page. I don't know why so for the moment I just create a static size page
|
||||||
|
// Far from ideal but at least I can use the memory window!
|
||||||
|
this->SetSize(wxSize(1000, 200));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThreadList::reloadThreads()
|
||||||
|
{
|
||||||
|
threads = getEEThreads();
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ThreadList::getRowCount()
|
||||||
|
{
|
||||||
|
return threads.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString ThreadList::getColumnText(int item, int col) const
|
||||||
|
{
|
||||||
|
if (item < 0 || item >= (int)threads.size())
|
||||||
|
return L"";
|
||||||
|
|
||||||
|
FastFormatUnicode dest;
|
||||||
|
const EEThread& thread = threads[item];
|
||||||
|
|
||||||
|
switch (col)
|
||||||
|
{
|
||||||
|
case TL_TID:
|
||||||
|
dest.Write("%d",thread.tid);
|
||||||
|
break;
|
||||||
|
case TL_PROGRAMCOUNTER:
|
||||||
|
if (thread.data.status == THS_RUN)
|
||||||
|
dest.Write("0x%08X", cpu->getPC());
|
||||||
|
else
|
||||||
|
dest.Write("0x%08X", thread.data.entry);
|
||||||
|
break;
|
||||||
|
case TL_ENTRYPOINT:
|
||||||
|
dest.Write("0x%08X", thread.data.entry_init);
|
||||||
|
break;
|
||||||
|
case TL_PRIORITY:
|
||||||
|
dest.Write("0x%02X", thread.data.currentPriority);
|
||||||
|
break;
|
||||||
|
case TL_STATE:
|
||||||
|
switch (thread.data.status)
|
||||||
|
{
|
||||||
|
case THS_BAD:
|
||||||
|
dest.Write("Bad");
|
||||||
|
break;
|
||||||
|
case THS_RUN:
|
||||||
|
dest.Write("Running");
|
||||||
|
break;
|
||||||
|
case THS_READY:
|
||||||
|
dest.Write("Ready");
|
||||||
|
break;
|
||||||
|
case THS_WAIT:
|
||||||
|
dest.Write("Waiting");
|
||||||
|
break;
|
||||||
|
case THS_SUSPEND:
|
||||||
|
dest.Write("Suspended");
|
||||||
|
break;
|
||||||
|
case THS_WAIT_SUSPEND:
|
||||||
|
dest.Write("Waiting/Suspended");
|
||||||
|
break;
|
||||||
|
case THS_DORMANT:
|
||||||
|
dest.Write("Dormant");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TL_WAITTYPE:
|
||||||
|
switch (thread.data.waitType)
|
||||||
|
{
|
||||||
|
case WAIT_NONE:
|
||||||
|
dest.Write("None");
|
||||||
|
break;
|
||||||
|
case WAIT_WAKEUP_REQ:
|
||||||
|
dest.Write("Wakeup request");
|
||||||
|
break;
|
||||||
|
case WAIT_SEMA:
|
||||||
|
dest.Write("Semaphore");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return L"Invalid";
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThreadList::onDoubleClick(int itemIndex, const wxPoint& point)
|
||||||
|
{
|
||||||
|
if (itemIndex < 0 || itemIndex >= (int)threads.size())
|
||||||
|
return;
|
||||||
|
|
||||||
|
const EEThread& thread = threads[itemIndex];
|
||||||
|
|
||||||
|
switch (thread.data.status)
|
||||||
|
{
|
||||||
|
case THS_DORMANT:
|
||||||
|
case THS_BAD:
|
||||||
|
postEvent(debEVT_GOTOINDISASM,thread.data.entry_init);
|
||||||
|
break;
|
||||||
|
case THS_RUN:
|
||||||
|
postEvent(debEVT_GOTOINDISASM,cpu->getPC());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
postEvent(debEVT_GOTOINDISASM,thread.data.entry);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,6 +17,7 @@
|
||||||
#include <wx/listctrl.h>
|
#include <wx/listctrl.h>
|
||||||
#include "DebugTools/DebugInterface.h"
|
#include "DebugTools/DebugInterface.h"
|
||||||
#include "DebugTools/Breakpoints.h"
|
#include "DebugTools/Breakpoints.h"
|
||||||
|
#include "DebugTools/BiosDebugData.h"
|
||||||
#include "CtrlDisassemblyView.h"
|
#include "CtrlDisassemblyView.h"
|
||||||
|
|
||||||
struct GenericListViewColumn
|
struct GenericListViewColumn
|
||||||
|
@ -74,7 +75,6 @@ private:
|
||||||
void toggleEnabled(int itemIndex);
|
void toggleEnabled(int itemIndex);
|
||||||
void gotoBreakpointAddress(int itemIndex);
|
void gotoBreakpointAddress(int itemIndex);
|
||||||
void removeBreakpoint(int itemIndex);
|
void removeBreakpoint(int itemIndex);
|
||||||
void postEvent(wxEventType type, int value);
|
|
||||||
void showMenu(const wxPoint& pos);
|
void showMenu(const wxPoint& pos);
|
||||||
|
|
||||||
std::vector<BreakPoint> displayedBreakPoints_;
|
std::vector<BreakPoint> displayedBreakPoints_;
|
||||||
|
@ -82,3 +82,19 @@ private:
|
||||||
DebugInterface* cpu;
|
DebugInterface* cpu;
|
||||||
CtrlDisassemblyView* disasm;
|
CtrlDisassemblyView* disasm;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ThreadList: public GenericListView
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ThreadList(wxWindow* parent, DebugInterface* _cpu);
|
||||||
|
void reloadThreads();
|
||||||
|
protected:
|
||||||
|
void onPopupClick(wxCommandEvent& evt);
|
||||||
|
|
||||||
|
virtual wxString getColumnText(int row, int col) const;
|
||||||
|
virtual int getRowCount();
|
||||||
|
virtual void onDoubleClick(int itemIndex, const wxPoint& point);
|
||||||
|
private:
|
||||||
|
DebugInterface* cpu;
|
||||||
|
std::vector<EEThread> threads;
|
||||||
|
};
|
||||||
|
|
|
@ -108,6 +108,13 @@ CpuTabPage::CpuTabPage(wxWindow* parent, DebugInterface* _cpu)
|
||||||
breakpointList = new BreakpointList(bottomTabs,cpu,disassembly);
|
breakpointList = new BreakpointList(bottomTabs,cpu,disassembly);
|
||||||
bottomTabs->AddPage(breakpointList,L"Breakpoints");
|
bottomTabs->AddPage(breakpointList,L"Breakpoints");
|
||||||
|
|
||||||
|
threadList = NULL;
|
||||||
|
if (cpu == &r5900Debug)
|
||||||
|
{
|
||||||
|
threadList = new ThreadList(bottomTabs,cpu);
|
||||||
|
bottomTabs->AddPage(threadList,L"Threads");
|
||||||
|
}
|
||||||
|
|
||||||
mainSizer->Add(bottomTabs,1,wxEXPAND);
|
mainSizer->Add(bottomTabs,1,wxEXPAND);
|
||||||
|
|
||||||
mainSizer->Layout();
|
mainSizer->Layout();
|
||||||
|
@ -162,6 +169,10 @@ void CpuTabPage::setBottomTabPage(wxWindow* win)
|
||||||
void CpuTabPage::update()
|
void CpuTabPage::update()
|
||||||
{
|
{
|
||||||
breakpointList->reloadBreakpoints();
|
breakpointList->reloadBreakpoints();
|
||||||
|
|
||||||
|
if (threadList != NULL)
|
||||||
|
threadList->reloadThreads();
|
||||||
|
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,7 @@ private:
|
||||||
wxNotebook* leftTabs;
|
wxNotebook* leftTabs;
|
||||||
BreakpointList* breakpointList;
|
BreakpointList* breakpointList;
|
||||||
wxStaticText* cyclesText;
|
wxStaticText* cyclesText;
|
||||||
|
ThreadList* threadList;
|
||||||
u32 lastCycles;
|
u32 lastCycles;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue