mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Buffer the breakpoints in UI to avoid overflows.
This commit is contained in:
parent
9209a30d9b
commit
9d8bdee089
4 changed files with 53 additions and 61 deletions
|
@ -53,7 +53,7 @@ size_t CBreakPoints::FindBreakpoint(u32 addr, bool matchTemp, bool temp)
|
|||
{
|
||||
for (size_t i = 0; i < breakPoints_.size(); ++i)
|
||||
{
|
||||
if (breakPoints_[i].iAddress == addr && (!matchTemp || breakPoints_[i].bTemporary == temp))
|
||||
if (breakPoints_[i].addr == addr && (!matchTemp || breakPoints_[i].temporary == temp))
|
||||
return i;
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ size_t CBreakPoints::FindMemCheck(u32 start, u32 end)
|
|||
bool CBreakPoints::IsAddressBreakPoint(u32 addr)
|
||||
{
|
||||
size_t bp = FindBreakpoint(addr);
|
||||
return bp != INVALID_BREAKPOINT && breakPoints_[bp].bOn;
|
||||
return bp != INVALID_BREAKPOINT && breakPoints_[bp].enabled;
|
||||
}
|
||||
|
||||
bool CBreakPoints::IsTempBreakPoint(u32 addr)
|
||||
|
@ -89,16 +89,16 @@ void CBreakPoints::AddBreakPoint(u32 addr, bool temp)
|
|||
if (bp == INVALID_BREAKPOINT)
|
||||
{
|
||||
BreakPoint pt;
|
||||
pt.bOn = true;
|
||||
pt.bTemporary = temp;
|
||||
pt.iAddress = addr;
|
||||
pt.enabled = true;
|
||||
pt.temporary = temp;
|
||||
pt.addr = addr;
|
||||
|
||||
breakPoints_.push_back(pt);
|
||||
Update(addr);
|
||||
}
|
||||
else if (!breakPoints_[bp].bOn)
|
||||
else if (!breakPoints_[bp].enabled)
|
||||
{
|
||||
breakPoints_[bp].bOn = true;
|
||||
breakPoints_[bp].enabled = true;
|
||||
Update(addr);
|
||||
}
|
||||
}
|
||||
|
@ -124,7 +124,7 @@ void CBreakPoints::ChangeBreakPoint(u32 addr, bool status)
|
|||
size_t bp = FindBreakpoint(addr);
|
||||
if (bp != INVALID_BREAKPOINT)
|
||||
{
|
||||
breakPoints_[bp].bOn = status;
|
||||
breakPoints_[bp].enabled = status;
|
||||
Update(addr);
|
||||
}
|
||||
}
|
||||
|
@ -146,7 +146,7 @@ void CBreakPoints::ClearTemporaryBreakPoints()
|
|||
bool update = false;
|
||||
for (int i = (int)breakPoints_.size()-1; i >= 0; --i)
|
||||
{
|
||||
if (breakPoints_[i].bTemporary)
|
||||
if (breakPoints_[i].temporary)
|
||||
{
|
||||
breakPoints_.erase(breakPoints_.begin() + i);
|
||||
update = true;
|
||||
|
@ -260,21 +260,6 @@ MemCheck *CBreakPoints::GetMemCheck(u32 address, int size)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int CBreakPoints::GetNumBreakpoints()
|
||||
{
|
||||
return (int)breakPoints_.size();
|
||||
}
|
||||
|
||||
const BreakPoint CBreakPoints::GetBreakpoint(size_t i)
|
||||
{
|
||||
return breakPoints_[i];
|
||||
}
|
||||
|
||||
int CBreakPoints::GetBreakpointAddress(size_t i)
|
||||
{
|
||||
return breakPoints_[i].iAddress;
|
||||
}
|
||||
|
||||
const std::vector<MemCheck> CBreakPoints::GetMemChecks()
|
||||
{
|
||||
return memChecks_;
|
||||
|
|
|
@ -35,18 +35,18 @@ struct BreakPoint
|
|||
{
|
||||
BreakPoint() : hasCond(false) {}
|
||||
|
||||
u32 iAddress;
|
||||
bool bOn;
|
||||
bool bTemporary;
|
||||
u32 addr;
|
||||
bool enabled;
|
||||
bool temporary;
|
||||
|
||||
bool hasCond;
|
||||
BreakPointCond cond;
|
||||
|
||||
bool operator == (const BreakPoint &other) const {
|
||||
return iAddress == other.iAddress;
|
||||
return addr == other.addr;
|
||||
}
|
||||
bool operator < (const BreakPoint &other) const {
|
||||
return iAddress < other.iAddress;
|
||||
return addr < other.addr;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -113,9 +113,6 @@ public:
|
|||
static void ClearAllMemChecks();
|
||||
|
||||
static MemCheck *GetMemCheck(u32 address, int size);
|
||||
static int GetNumBreakpoints();
|
||||
static const BreakPoint GetBreakpoint(size_t i);
|
||||
static int GetBreakpointAddress(size_t i);
|
||||
|
||||
// TODO: MemChecks somehow too?
|
||||
static void SetSkipFirst(u32 pc) { breakSkipFirstAt_ = pc; }
|
||||
|
|
|
@ -211,12 +211,12 @@ CDisasm::~CDisasm()
|
|||
{
|
||||
}
|
||||
|
||||
int getTotalBreakpointCount()
|
||||
int CDisasm::getTotalBreakpointCount()
|
||||
{
|
||||
int count = (int)CBreakPoints::GetMemChecks().size();
|
||||
for (size_t i = 0; i < CBreakPoints::GetBreakpoints().size(); i++)
|
||||
{
|
||||
if (!CBreakPoints::GetBreakpoint(i).bTemporary) count++;
|
||||
if (!displayedBreakPoints_[i].temporary) count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
|
@ -224,6 +224,10 @@ int getTotalBreakpointCount()
|
|||
|
||||
void CDisasm::updateBreakpointList()
|
||||
{
|
||||
// Update the items we're displaying from the debugger.
|
||||
displayedBreakPoints_ = CBreakPoints::GetBreakpoints();
|
||||
displayedMemChecks_= CBreakPoints::GetMemChecks();
|
||||
|
||||
HWND breakpointHwnd = GetDlgItem(m_hDlg, IDC_BREAKPOINTLIST);
|
||||
int breakpointCount = getTotalBreakpointCount();
|
||||
int items = ListView_GetItemCount(breakpointHwnd);
|
||||
|
@ -252,21 +256,21 @@ void CDisasm::updateBreakpointList()
|
|||
UpdateWindow(breakpointHwnd);
|
||||
}
|
||||
|
||||
int getBreakpointIndex(int itemIndex, bool& isMemory)
|
||||
int CDisasm::getBreakpointIndex(int itemIndex, bool& isMemory)
|
||||
{
|
||||
// memory breakpoints first
|
||||
if (itemIndex < CBreakPoints::GetMemChecks().size())
|
||||
if (itemIndex < (int)displayedMemChecks_.size())
|
||||
{
|
||||
isMemory = true;
|
||||
return itemIndex;
|
||||
}
|
||||
|
||||
itemIndex -= (int)CBreakPoints::GetMemChecks().size();
|
||||
itemIndex -= (int)displayedMemChecks_.size();
|
||||
|
||||
int i = 0;
|
||||
while (i < CBreakPoints::GetNumBreakpoints())
|
||||
size_t i = 0;
|
||||
while (i < displayedBreakPoints_.size())
|
||||
{
|
||||
if (CBreakPoints::GetBreakpoint(i).bTemporary)
|
||||
if (displayedBreakPoints_[i].temporary)
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
|
@ -276,7 +280,7 @@ int getBreakpointIndex(int itemIndex, bool& isMemory)
|
|||
if (itemIndex == 0)
|
||||
{
|
||||
isMemory = false;
|
||||
return i;
|
||||
return (int)i;
|
||||
}
|
||||
|
||||
i++;
|
||||
|
@ -294,10 +298,10 @@ void CDisasm::removeBreakpoint(int itemIndex)
|
|||
|
||||
if (isMemory)
|
||||
{
|
||||
auto memchecks = CBreakPoints::GetMemChecks();
|
||||
CBreakPoints::RemoveMemCheck(memchecks[index].start, memchecks[index].end);
|
||||
auto mc = displayedMemChecks_[index];
|
||||
CBreakPoints::RemoveMemCheck(mc.start, mc.end);
|
||||
} else {
|
||||
u32 address = CBreakPoints::GetBreakpointAddress(index);
|
||||
u32 address = displayedBreakPoints_[index].addr;
|
||||
CBreakPoints::RemoveBreakPoint(address);
|
||||
}
|
||||
}
|
||||
|
@ -310,14 +314,13 @@ void CDisasm::gotoBreakpointAddress(int itemIndex)
|
|||
|
||||
if (isMemory)
|
||||
{
|
||||
auto memchecks = CBreakPoints::GetMemChecks();
|
||||
u32 address = memchecks[index].start;
|
||||
u32 address = displayedMemChecks_[index].start;
|
||||
|
||||
for (int i=0; i<numCPUs; i++)
|
||||
if (memoryWindow[i])
|
||||
memoryWindow[i]->Goto(address);
|
||||
} else {
|
||||
u32 address = CBreakPoints::GetBreakpointAddress(index);
|
||||
u32 address = displayedBreakPoints_[index].addr;
|
||||
Goto(address);
|
||||
SetFocus(GetDlgItem(m_hDlg, IDC_DISASMVIEW));
|
||||
}
|
||||
|
@ -337,7 +340,6 @@ void CDisasm::handleBreakpointNotify(LPARAM lParam)
|
|||
if (((LPNMHDR)lParam)->code == LVN_GETDISPINFO)
|
||||
{
|
||||
NMLVDISPINFO* dispInfo = (NMLVDISPINFO*)lParam;
|
||||
auto mem = CBreakPoints::GetMemChecks();
|
||||
|
||||
bool isMemory;
|
||||
int index = getBreakpointIndex(dispInfo->item.iItem,isMemory);
|
||||
|
@ -350,7 +352,7 @@ void CDisasm::handleBreakpointNotify(LPARAM lParam)
|
|||
{
|
||||
if (isMemory)
|
||||
{
|
||||
switch (mem[index].cond)
|
||||
switch (displayedMemChecks_[index].cond)
|
||||
{
|
||||
case MEMCHECK_READ:
|
||||
strcpy(breakpointText, "Read");
|
||||
|
@ -371,9 +373,9 @@ void CDisasm::handleBreakpointNotify(LPARAM lParam)
|
|||
{
|
||||
if (isMemory)
|
||||
{
|
||||
sprintf(breakpointText,"0x%08X",mem[index].start);
|
||||
sprintf(breakpointText,"0x%08X",displayedMemChecks_[index].start);
|
||||
} else {
|
||||
sprintf(breakpointText,"0x%08X",CBreakPoints::GetBreakpointAddress(index));
|
||||
sprintf(breakpointText,"0x%08X",displayedBreakPoints_[index].addr);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -381,10 +383,11 @@ void CDisasm::handleBreakpointNotify(LPARAM lParam)
|
|||
{
|
||||
if (isMemory)
|
||||
{
|
||||
if (mem[index].end == 0) sprintf(breakpointText,"0x%08X",1);
|
||||
else sprintf(breakpointText,"0x%08X",mem[index].end-mem[index].start);
|
||||
auto mc = displayedMemChecks_[index];
|
||||
if (mc.end == 0) sprintf(breakpointText,"0x%08X",1);
|
||||
else sprintf(breakpointText,"0x%08X",mc.end-mc.start);
|
||||
} else {
|
||||
const char* sym = cpu->findSymbolForAddress(CBreakPoints::GetBreakpointAddress(index));
|
||||
const char* sym = cpu->findSymbolForAddress(displayedBreakPoints_[index].addr);
|
||||
if (sym != NULL)
|
||||
{
|
||||
strcpy(breakpointText,sym);
|
||||
|
@ -401,7 +404,7 @@ void CDisasm::handleBreakpointNotify(LPARAM lParam)
|
|||
strcpy(breakpointText,"-");
|
||||
} else {
|
||||
CtrlDisAsmView *ptr = CtrlDisAsmView::getFrom(GetDlgItem(m_hDlg,IDC_DISASMVIEW));
|
||||
ptr->getOpcodeText(CBreakPoints::GetBreakpointAddress(index),breakpointText);
|
||||
ptr->getOpcodeText(displayedBreakPoints_[index].addr,breakpointText);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -409,7 +412,7 @@ void CDisasm::handleBreakpointNotify(LPARAM lParam)
|
|||
{
|
||||
if (isMemory)
|
||||
{
|
||||
sprintf(breakpointText,"%d",mem[index].numHits);
|
||||
sprintf(breakpointText,"%d",displayedMemChecks_[index].numHits);
|
||||
} else {
|
||||
strcpy(breakpointText,"-");
|
||||
}
|
||||
|
@ -419,9 +422,9 @@ void CDisasm::handleBreakpointNotify(LPARAM lParam)
|
|||
{
|
||||
if (isMemory)
|
||||
{
|
||||
strcpy(breakpointText,mem[index].result & MEMCHECK_BREAK ? "True" : "False");
|
||||
strcpy(breakpointText,displayedMemChecks_[index].result & MEMCHECK_BREAK ? "True" : "False");
|
||||
} else {
|
||||
strcpy(breakpointText,CBreakPoints::GetBreakpoint(index).bOn ? "True" : "False");
|
||||
strcpy(breakpointText,displayedBreakPoints_[index].enabled ? "True" : "False");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -5,10 +5,12 @@
|
|||
|
||||
#include "../W32Util/DialogManager.h"
|
||||
#include "CtrlDisasmView.h"
|
||||
#include "../../Core/MIPS/MIPSDebugInterface.h"
|
||||
#include "CPURegsInterface.h"
|
||||
#include "../../Globals.h"
|
||||
#include "../../Core/CPU.h"
|
||||
#include "Globals.h"
|
||||
#include "Core/CPU.h"
|
||||
#include "Core/MIPS/MIPSDebugInterface.h"
|
||||
#include "Core/Debugger/Breakpoints.h"
|
||||
#include <vector>
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
|
@ -27,6 +29,9 @@ private:
|
|||
DebugInterface *cpu;
|
||||
u64 lastTicks;
|
||||
|
||||
std::vector<BreakPoint> displayedBreakPoints_;
|
||||
std::vector<MemCheck> displayedMemChecks_;
|
||||
|
||||
BOOL DlgProc(UINT message, WPARAM wParam, LPARAM lParam);
|
||||
void UpdateSize(WORD width, WORD height);
|
||||
void SavePosition();
|
||||
|
@ -34,6 +39,8 @@ private:
|
|||
void handleBreakpointNotify(LPARAM lParam);
|
||||
void gotoBreakpointAddress(int itemIndex);
|
||||
void removeBreakpoint(int itemIndex);
|
||||
int getTotalBreakpointCount();
|
||||
int getBreakpointIndex(int itemIndex, bool& isMemory);
|
||||
public:
|
||||
int index; //helper
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue