Debugger: Fixed crash in hex editor when PRG or CHR was larger than 10mb

This commit is contained in:
Souryo 2017-05-02 21:23:28 -04:00
parent 9775127417
commit fbc94bee7d
8 changed files with 34 additions and 13 deletions

View file

@ -778,11 +778,6 @@ void Debugger::SetPpuViewerScanlineCycle(int32_t scanline, int32_t cycle)
_ppuViewerCycle = cycle;
}
int Debugger::GetMemorySize(DebugMemoryType memoryType)
{
return _mapper->GetMemorySize(memoryType);
}
void Debugger::SetLastFramePpuScroll(uint16_t x, uint16_t y)
{
if(Debugger::Instance) {

View file

@ -181,8 +181,6 @@ public:
static bool IsEnabled();
static void BreakIfDebugging();
int GetMemorySize(DebugMemoryType memoryType);
void SetFreezeState(uint16_t address, bool frozen);
void GetFreezeState(uint16_t startAddress, uint16_t length, bool* freezeState);

View file

@ -3,12 +3,19 @@
#include "Console.h"
#include "DebugBreakHelper.h"
#include "Debugger.h"
#include "MemoryDumper.h"
MemoryAccessCounter::MemoryAccessCounter(Debugger* debugger)
{
_debugger = debugger;
int memorySizes[4] = { 0x2000, _debugger->GetMemorySize(DebugMemoryType::PrgRom), _debugger->GetMemorySize(DebugMemoryType::WorkRam), _debugger->GetMemorySize(DebugMemoryType::SaveRam) };
uint32_t memorySizes[4] = {
0x2000,
_debugger->GetMemoryDumper()->GetMemorySize(DebugMemoryType::PrgRom),
_debugger->GetMemoryDumper()->GetMemorySize(DebugMemoryType::WorkRam),
_debugger->GetMemoryDumper()->GetMemorySize(DebugMemoryType::SaveRam)
};
for(int i = 0; i < 4; i++) {
_readCounts[i].insert(_readCounts[i].end(), memorySizes[i], 0);
_writeCounts[i].insert(_writeCounts[i].end(), memorySizes[i], 0);

View file

@ -44,6 +44,25 @@ void MemoryDumper::SetMemoryState(DebugMemoryType type, uint8_t *buffer)
}
}
uint32_t MemoryDumper::GetMemorySize(DebugMemoryType type)
{
switch(type) {
case DebugMemoryType::CpuMemory: return 0x10000;
case DebugMemoryType::PpuMemory: return 0x4000;
case DebugMemoryType::PaletteMemory: return 0x20;
case DebugMemoryType::SpriteMemory: return 0x100;
case DebugMemoryType::SecondarySpriteMemory: return 0x20;
case DebugMemoryType::InternalRam: return 0x800;
case DebugMemoryType::PrgRom:
case DebugMemoryType::ChrRom:
case DebugMemoryType::ChrRam:
case DebugMemoryType::WorkRam:
case DebugMemoryType::SaveRam:
return _mapper->GetMemorySize(type);
}
return 0;
}
uint32_t MemoryDumper::GetMemoryState(DebugMemoryType type, uint8_t *buffer)
{
switch(type) {

View file

@ -22,6 +22,7 @@ private:
public:
MemoryDumper(shared_ptr<PPU> ppu, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseMapper> mapper, shared_ptr<CodeDataLogger> codeDataLogger, Debugger *debugger, shared_ptr<Disassembler> disassembler);
uint32_t GetMemorySize(DebugMemoryType type);
uint32_t GetMemoryState(DebugMemoryType type, uint8_t *buffer);
void GetNametable(int nametableIndex, uint32_t* frameBuffer, uint8_t* tileData, uint8_t* paletteData);
void GetChrBank(int bankIndex, uint32_t* frameBuffer, uint8_t palette, bool largeSprites, CdlHighlightType highlightType);

View file

@ -2,6 +2,7 @@
#include "Profiler.h"
#include "DebugBreakHelper.h"
#include "Debugger.h"
#include "MemoryDumper.h"
Profiler::Profiler(Debugger * debugger)
{
@ -11,7 +12,7 @@ Profiler::Profiler(Debugger * debugger)
_currentCycleCount = 0;
_currentInstruction = 0;
int size = _debugger->GetMemorySize(DebugMemoryType::PrgRom);
int size = _debugger->GetMemoryDumper()->GetMemorySize(DebugMemoryType::PrgRom);
_resetFunctionIndex = size;
_inMemoryFunctionIndex = size + 1;
_currentFunction = _resetFunctionIndex;

View file

@ -275,7 +275,7 @@ namespace Mesen.GUI
[DllImport(DLLPath, EntryPoint = "DebugGetMemoryState")] private static extern UInt32 DebugGetMemoryStateWrapper(DebugMemoryType type, IntPtr buffer);
public static byte[] DebugGetMemoryState(DebugMemoryType type)
{
byte[] buffer = new byte[10485760]; //10mb buffer
byte[] buffer = new byte[InteropEmu.DebugGetMemorySize(type)];
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
try {
UInt32 memorySize = InteropEmu.DebugGetMemoryStateWrapper(type, handle.AddrOfPinnedObject());

View file

@ -51,9 +51,10 @@ extern "C"
DllExport void __stdcall DebugSetPpuViewerScanlineCycle(int32_t scanline, int32_t cycle) { return GetDebugger()->SetPpuViewerScanlineCycle(scanline, cycle); }
DllExport void __stdcall DebugSetNextStatement(uint16_t addr) { GetDebugger()->SetNextStatement(addr); }
DllExport void __stdcall DebugSetMemoryState(uint32_t type, uint8_t *buffer) { GetDebugger()->GetMemoryDumper()->SetMemoryState((DebugMemoryType)type, buffer); }
DllExport void __stdcall DebugSetMemoryState(DebugMemoryType type, uint8_t *buffer) { GetDebugger()->GetMemoryDumper()->SetMemoryState(type, buffer); }
DllExport uint32_t __stdcall DebugGetMemoryState(uint32_t type, uint8_t *buffer) { return GetDebugger()->GetMemoryDumper()->GetMemoryState((DebugMemoryType)type, buffer); }
DllExport uint32_t __stdcall DebugGetMemorySize(DebugMemoryType type) { return GetDebugger()->GetMemoryDumper()->GetMemorySize(type); }
DllExport uint32_t __stdcall DebugGetMemoryState(DebugMemoryType type, uint8_t *buffer) { return GetDebugger()->GetMemoryDumper()->GetMemoryState(type, buffer); }
DllExport void __stdcall DebugGetNametable(uint32_t nametableIndex, uint32_t *frameBuffer, uint8_t *tileData, uint8_t *attributeData) { GetDebugger()->GetMemoryDumper()->GetNametable(nametableIndex, frameBuffer, tileData, attributeData); }
DllExport void __stdcall DebugGetChrBank(uint32_t bankIndex, uint32_t *frameBuffer, uint8_t palette, bool largeSprites, CdlHighlightType highlightType) { GetDebugger()->GetMemoryDumper()->GetChrBank(bankIndex, frameBuffer, palette, largeSprites, highlightType); }
DllExport void __stdcall DebugGetSprites(uint32_t *frameBuffer) { GetDebugger()->GetMemoryDumper()->GetSprites(frameBuffer); }
@ -83,7 +84,6 @@ extern "C"
DllExport void __stdcall DebugSetMemoryValue(DebugMemoryType type, uint32_t address, uint8_t value) { return GetDebugger()->GetMemoryDumper()->SetMemoryValue(type, address, value); }
DllExport void __stdcall DebugSetMemoryValues(DebugMemoryType type, uint32_t address, uint8_t* data, int32_t length) { return GetDebugger()->GetMemoryDumper()->SetMemoryValues(type, address, data, length); }
DllExport int32_t __stdcall DebugGetMemorySize(DebugMemoryType type) { return GetDebugger()->GetMemorySize(type); }
DllExport void __stdcall DebugGetMemoryAccessCounts(AddressType memoryType, MemoryOperationType operationType, uint32_t* counts, bool forUninitReads) { GetDebugger()->GetMemoryAccessCounter()->GetAccessCounts(memoryType, operationType, counts, forUninitReads); }
DllExport void __stdcall DebugResetMemoryAccessCounts() { GetDebugger()->GetMemoryAccessCounter()->ResetCounts(); }
DllExport void __stdcall DebugGetMemoryAccessStamps(uint32_t offset, uint32_t length, DebugMemoryType memoryType, MemoryOperationType operationType, uint32_t* stamps) { GetDebugger()->GetMemoryAccessCounter()->GetAccessStamps(offset, length, memoryType, operationType, stamps); }