pcsx2 debugger: be more friendly with linux

* Fix a couple of gcc warning and replace deprecated function
* Fix the redraw of the memory zone
* Avoid a crash if we breakpoint before running
* Use %s on linux because %S isn't supported
* Properly check .result in recMemCheck. Add some code to print hit
  breakpoint.
* breakpoint window isn't properly resized so used a static size as a
  temporary workaround
This commit is contained in:
Gregory Hainaut 2014-03-25 17:31:52 +01:00
parent e59b252cc0
commit 0980591fa2
6 changed files with 56 additions and 8 deletions

View File

@ -6,6 +6,7 @@
#include "AppCoreThread.h" #include "AppCoreThread.h"
#include "Debug.h" #include "Debug.h"
#include "../VU.h" #include "../VU.h"
#include "Counters.h"
#include "../R3000A.h" #include "../R3000A.h"
#include "../IopMem.h" #include "../IopMem.h"
@ -149,7 +150,7 @@ private:
bool DebugInterface::isAlive() bool DebugInterface::isAlive()
{ {
return GetCoreThread().IsOpen(); return GetCoreThread().IsOpen() && g_FrameCount > 0;
} }
bool DebugInterface::isCpuPaused() bool DebugInterface::isCpuPaused()

View File

@ -291,7 +291,7 @@ void CtrlDisassemblyView::drawBranchLine(wxDC& dc, std::map<u32,int>& addressPos
int getBackgroundColor(unsigned int address) int getBackgroundColor(unsigned int address)
{ {
int colors[6] = {0xFFe0FFFF,0xFFFFe0e0,0xFFe8e8FF,0xFFFFe0FF,0xFFe0FFe0,0xFFFFFFe0}; u32 colors[6] = {0xFFe0FFFF,0xFFFFe0e0,0xFFe8e8FF,0xFFFFe0FF,0xFFe0FFe0,0xFFFFFFe0};
int n=symbolMap.GetFunctionNum(address); int n=symbolMap.GetFunctionNum(address);
if (n==-1) return 0xFFFFFFFF; if (n==-1) return 0xFFFFFFFF;
return colors[n%6]; return colors[n%6];

View File

@ -108,6 +108,14 @@ void CtrlMemView::render(wxDC& dc)
bool hasFocus = wxWindow::FindFocus() == this; bool hasFocus = wxWindow::FindFocus() == this;
int visibleRows = GetClientSize().y/rowHeight; int visibleRows = GetClientSize().y/rowHeight;
wxColor white = wxColor(0xFFFFFFFF);
dc.SetBrush(wxBrush(white));
dc.SetPen(wxPen(white));
int width,height;
dc.GetSize(&width,&height);
dc.DrawRectangle(0,0,width,height);
for (int i = 0; i < visibleRows+1; i++) for (int i = 0; i < visibleRows+1; i++)
{ {
wchar_t temp[32]; wchar_t temp[32];

View File

@ -53,7 +53,7 @@ CtrlRegisterList::CtrlRegisterList(wxWindow* parent, DebugInterface* _cpu)
} }
SetDoubleBuffered(true); SetDoubleBuffered(true);
SetInitialBestSize(ClientToWindowSize(GetMinClientSize())); SetInitialSize(ClientToWindowSize(GetMinClientSize()));
} }
void CtrlRegisterList::postEvent(wxEventType type, wxString text) void CtrlRegisterList::postEvent(wxEventType type, wxString text)
@ -341,19 +341,19 @@ void CtrlRegisterList::onPopupClick(wxCommandEvent& evt)
{ {
case ID_REGISTERLIST_DISPLAY32: case ID_REGISTERLIST_DISPLAY32:
maxBits = 32; maxBits = 32;
SetBestSize(ClientToWindowSize(GetMinClientSize())); SetInitialSize(ClientToWindowSize(GetMinClientSize()));
postEvent(debEVT_UPDATELAYOUT,0); postEvent(debEVT_UPDATELAYOUT,0);
Refresh(); Refresh();
break; break;
case ID_REGISTERLIST_DISPLAY64: case ID_REGISTERLIST_DISPLAY64:
maxBits = 64; maxBits = 64;
SetBestSize(ClientToWindowSize(GetMinClientSize())); SetInitialSize(ClientToWindowSize(GetMinClientSize()));
postEvent(debEVT_UPDATELAYOUT,0); postEvent(debEVT_UPDATELAYOUT,0);
Refresh(); Refresh();
break; break;
case ID_REGISTERLIST_DISPLAY128: case ID_REGISTERLIST_DISPLAY128:
maxBits = 128; maxBits = 128;
SetBestSize(ClientToWindowSize(GetMinClientSize())); SetInitialSize(ClientToWindowSize(GetMinClientSize()));
postEvent(debEVT_UPDATELAYOUT,0); postEvent(debEVT_UPDATELAYOUT,0);
Refresh(); Refresh();
break; break;

View File

@ -49,6 +49,11 @@ GenericListViewColumn breakpointColumns[BPL_COLUMNCOUNT] = {
BreakpointList::BreakpointList(wxWindow* parent, DebugInterface* _cpu, CtrlDisassemblyView* _disassembly) BreakpointList::BreakpointList(wxWindow* parent, DebugInterface* _cpu, CtrlDisassemblyView* _disassembly)
: wxListView(parent,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxLC_VIRTUAL|wxLC_REPORT|wxLC_SINGLE_SEL|wxNO_BORDER), cpu(_cpu), disasm(_disassembly) : wxListView(parent,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxLC_VIRTUAL|wxLC_REPORT|wxLC_SINGLE_SEL|wxNO_BORDER), cpu(_cpu), disasm(_disassembly)
{ {
#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
insertListViewColumns(this,breakpointColumns,BPL_COLUMNCOUNT); insertListViewColumns(this,breakpointColumns,BPL_COLUMNCOUNT);
} }
@ -130,7 +135,11 @@ wxString BreakpointList::OnGetItemText(long item, long col) const
const std::string sym = symbolMap.GetLabelString(displayedBreakPoints_[index].addr); const std::string sym = symbolMap.GetLabelString(displayedBreakPoints_[index].addr);
if (!sym.empty()) if (!sym.empty())
{ {
#ifdef __LINUX__
swprintf(dest,256,L"%s",sym.c_str());
#else
swprintf(dest,256,L"%S",sym.c_str()); swprintf(dest,256,L"%S",sym.c_str());
#endif
} else { } else {
wcscpy(dest,L"-"); wcscpy(dest,L"-");
} }
@ -144,7 +153,11 @@ wxString BreakpointList::OnGetItemText(long item, long col) const
} else { } else {
char temp[256]; char temp[256];
disasm->getOpcodeText(displayedBreakPoints_[index].addr, temp); disasm->getOpcodeText(displayedBreakPoints_[index].addr, temp);
#ifdef __LINUX__
swprintf(dest,256,L"%s",temp);
#else
swprintf(dest,256,L"%S",temp); swprintf(dest,256,L"%S",temp);
#endif
} }
} }
break; break;
@ -153,7 +166,11 @@ wxString BreakpointList::OnGetItemText(long item, long col) const
if (isMemory || displayedBreakPoints_[index].hasCond == false) { if (isMemory || displayedBreakPoints_[index].hasCond == false) {
wcscpy(dest,L"-"); wcscpy(dest,L"-");
} else { } else {
#ifdef __LINUX__
swprintf(dest,256,L"%s",displayedBreakPoints_[index].cond.expressionString);
#else
swprintf(dest,256,L"%S",displayedBreakPoints_[index].cond.expressionString); swprintf(dest,256,L"%S",displayedBreakPoints_[index].cond.expressionString);
#endif
} }
} }
break; break;
@ -169,9 +186,17 @@ wxString BreakpointList::OnGetItemText(long item, long col) const
case BPL_ENABLED: case BPL_ENABLED:
{ {
if (isMemory) { if (isMemory) {
#ifdef __LINUX__
swprintf(dest,256,L"%s",displayedMemChecks_[index].cond & MEMCHECK_BREAK ? "true" : "false");
#else
swprintf(dest,256,L"%S",displayedMemChecks_[index].cond & MEMCHECK_BREAK ? "true" : "false"); swprintf(dest,256,L"%S",displayedMemChecks_[index].cond & MEMCHECK_BREAK ? "true" : "false");
#endif
} else { } else {
#ifdef __LINUX__
swprintf(dest,256,L"%s",displayedBreakPoints_[index].enabled ? "true" : "false");
#else
swprintf(dest,256,L"%S",displayedBreakPoints_[index].enabled ? "true" : "false"); swprintf(dest,256,L"%S",displayedBreakPoints_[index].enabled ? "true" : "false");
#endif
} }
} }
break; break;

View File

@ -1295,6 +1295,14 @@ void dynarecMemcheck()
recExitExecution(); recExitExecution();
} }
__fastcall void dynarecMemLogcheck(u32 start, bool store)
{
if (store)
DevCon.WriteLn("Hit store breakpoint @0x%x", start);
else
DevCon.WriteLn("Hit load breakpoint @0x%x", start);
}
void recMemcheck(u32 bits, bool store) void recMemcheck(u32 bits, bool store)
{ {
iFlushCall(FLUSH_INTERPRETER); iFlushCall(FLUSH_INTERPRETER);
@ -1315,7 +1323,7 @@ void recMemcheck(u32 bits, bool store)
auto checks = CBreakPoints::GetMemChecks(); auto checks = CBreakPoints::GetMemChecks();
for (size_t i = 0; i < checks.size(); i++) for (size_t i = 0; i < checks.size(); i++)
{ {
if ((checks[i].cond & MEMCHECK_BREAK) == 0) if (checks[i].result == 0)
continue; continue;
if ((checks[i].cond & MEMCHECK_WRITE) == 0 && store == true) if ((checks[i].cond & MEMCHECK_WRITE) == 0 && store == true)
continue; continue;
@ -1333,7 +1341,13 @@ void recMemcheck(u32 bits, bool store)
xForwardJGE8 next2; // if start >= address+size then goto next2 xForwardJGE8 next2; // if start >= address+size then goto next2
// hit the breakpoint // hit the breakpoint
xCALL(&dynarecMemcheck); if (checks[i].result & MEMCHECK_LOG) {
xMOV(edx, store);
xCALL(&dynarecMemLogcheck);
}
if (checks[i].result & MEMCHECK_BREAK) {
xCALL(&dynarecMemcheck);
}
next1.SetTarget(); next1.SetTarget();
next2.SetTarget(); next2.SetTarget();