From 11e5fe8879406398842ba4ddc5bc1958726b93e5 Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Mon, 18 Jul 2016 19:17:59 +0200 Subject: [PATCH 1/8] pcsx2 gui: fix a pseudo memory leak on SavestateEntryPack It is a pseudo leak as it is a global object. Nevertheless it pollutes the valgrind log. v2: * use an array of unique pointer * use ArraySize instead of a constant --- pcsx2/gui/SysState.cpp | 87 ++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/pcsx2/gui/SysState.cpp b/pcsx2/gui/SysState.cpp index bb862cd618..ac1717de3c 100644 --- a/pcsx2/gui/SysState.cpp +++ b/pcsx2/gui/SysState.cpp @@ -42,9 +42,10 @@ class BaseSavestateEntry { protected: BaseSavestateEntry() {} - virtual ~BaseSavestateEntry() throw() {} public: + virtual ~BaseSavestateEntry() throw() {} + virtual wxString GetFilename() const=0; virtual void FreezeIn( pxInputStream& reader ) const=0; virtual void FreezeOut( SaveStateBase& writer ) const=0; @@ -142,10 +143,12 @@ void PluginSavestateEntry::FreezeOut( SaveStateBase& writer ) const class SavestateEntry_EmotionMemory : public MemorySavestateEntry { public: + virtual ~SavestateEntry_EmotionMemory() throw() {} + wxString GetFilename() const { return L"eeMemory.bin"; } u8* GetDataPtr() const { return eeMem->Main; } uint GetDataSize() const { return sizeof(eeMem->Main); } - + virtual void FreezeIn( pxInputStream& reader ) const { SysClearExecutionCache(); @@ -156,6 +159,8 @@ public: class SavestateEntry_IopMemory : public MemorySavestateEntry { public: + virtual ~SavestateEntry_IopMemory() throw() {} + wxString GetFilename() const { return L"iopMemory.bin"; } u8* GetDataPtr() const { return iopMem->Main; } uint GetDataSize() const { return sizeof(iopMem->Main); } @@ -164,6 +169,8 @@ public: class SavestateEntry_HwRegs : public MemorySavestateEntry { public: + virtual ~SavestateEntry_HwRegs() throw() {} + wxString GetFilename() const { return L"eeHwRegs.bin"; } u8* GetDataPtr() const { return eeHw; } uint GetDataSize() const { return sizeof(eeHw); } @@ -172,6 +179,8 @@ public: class SavestateEntry_IopHwRegs : public MemorySavestateEntry { public: + virtual ~SavestateEntry_IopHwRegs() throw() {} + wxString GetFilename() const { return L"iopHwRegs.bin"; } u8* GetDataPtr() const { return iopHw; } uint GetDataSize() const { return sizeof(iopHw); } @@ -180,6 +189,8 @@ public: class SavestateEntry_Scratchpad : public MemorySavestateEntry { public: + virtual ~SavestateEntry_Scratchpad() throw() {} + wxString GetFilename() const { return L"Scratchpad.bin"; } u8* GetDataPtr() const { return eeMem->Scratch; } uint GetDataSize() const { return sizeof(eeMem->Scratch); } @@ -188,6 +199,8 @@ public: class SavestateEntry_VU0mem : public MemorySavestateEntry { public: + virtual ~SavestateEntry_VU0mem() throw() {} + wxString GetFilename() const { return L"vu0Memory.bin"; } u8* GetDataPtr() const { return vuRegs[0].Mem; } uint GetDataSize() const { return VU0_MEMSIZE; } @@ -196,6 +209,8 @@ public: class SavestateEntry_VU1mem : public MemorySavestateEntry { public: + virtual ~SavestateEntry_VU1mem() throw() {} + wxString GetFilename() const { return L"vu1Memory.bin"; } u8* GetDataPtr() const { return vuRegs[1].Mem; } uint GetDataSize() const { return VU1_MEMSIZE; } @@ -204,6 +219,8 @@ public: class SavestateEntry_VU0prog : public MemorySavestateEntry { public: + virtual ~SavestateEntry_VU0prog() throw() {} + wxString GetFilename() const { return L"vu0MicroMem.bin"; } u8* GetDataPtr() const { return vuRegs[0].Micro; } uint GetDataSize() const { return VU0_PROGSIZE; } @@ -212,6 +229,8 @@ public: class SavestateEntry_VU1prog : public MemorySavestateEntry { public: + virtual ~SavestateEntry_VU1prog() throw() {} + wxString GetFilename() const { return L"vu1MicroMem.bin"; } u8* GetDataPtr() const { return vuRegs[1].Micro; } uint GetDataSize() const { return VU1_PROGSIZE; } @@ -227,42 +246,26 @@ public: // would not be useful). // -static const uint NumSavestateEntries = 9 + PluginId_Count; +static const std::unique_ptr SavestateEntries[] = { + std::unique_ptr(new SavestateEntry_EmotionMemory), + std::unique_ptr(new SavestateEntry_IopMemory), + std::unique_ptr(new SavestateEntry_HwRegs), + std::unique_ptr(new SavestateEntry_IopHwRegs), + std::unique_ptr(new SavestateEntry_Scratchpad), + std::unique_ptr(new SavestateEntry_VU0mem), + std::unique_ptr(new SavestateEntry_VU1mem), + std::unique_ptr(new SavestateEntry_VU0prog), + std::unique_ptr(new SavestateEntry_VU1prog), -class SavestateEntryPack : public ScopedAlloc -{ - typedef ScopedAlloc _parent; - -public: - SavestateEntryPack() - : _parent( NumSavestateEntries ) - { - uint i = 0; // more convenient in case we re-arrange anything... - - this->operator[](i++) = new SavestateEntry_EmotionMemory; - this->operator[](i++) = new SavestateEntry_IopMemory; - this->operator[](i++) = new SavestateEntry_HwRegs; - this->operator[](i++) = new SavestateEntry_IopHwRegs; - this->operator[](i++) = new SavestateEntry_Scratchpad; - this->operator[](i++) = new SavestateEntry_VU0mem; - this->operator[](i++) = new SavestateEntry_VU1mem; - this->operator[](i++) = new SavestateEntry_VU0prog; - this->operator[](i++) = new SavestateEntry_VU1prog; - - this->operator[](i++) = new PluginSavestateEntry( PluginId_GS ); - this->operator[](i++) = new PluginSavestateEntry( PluginId_PAD ); - this->operator[](i++) = new PluginSavestateEntry( PluginId_SPU2 ); - this->operator[](i++) = new PluginSavestateEntry( PluginId_CDVD ); - this->operator[](i++) = new PluginSavestateEntry( PluginId_USB ); - this->operator[](i++) = new PluginSavestateEntry( PluginId_FW ); - this->operator[](i++) = new PluginSavestateEntry( PluginId_DEV9 ); - } - - using _parent::operator[]; + std::unique_ptr(new PluginSavestateEntry( PluginId_GS )), + std::unique_ptr(new PluginSavestateEntry( PluginId_PAD )), + std::unique_ptr(new PluginSavestateEntry( PluginId_SPU2 )), + std::unique_ptr(new PluginSavestateEntry( PluginId_CDVD )), + std::unique_ptr(new PluginSavestateEntry( PluginId_USB )), + std::unique_ptr(new PluginSavestateEntry( PluginId_FW )), + std::unique_ptr(new PluginSavestateEntry( PluginId_DEV9 )) }; -static const SavestateEntryPack SavestateEntries; - // It's bad mojo to have savestates trying to read and write from the same file at the // same time. To prevent that we use this mutex lock, which is used by both the // CompressThread and the UnzipFromDisk events. (note that CompressThread locks the @@ -275,7 +278,7 @@ static void CheckVersion( pxInputStream& thr ) { u32 savever; thr.Read( savever ); - + // Major version mismatch. Means we can't load this savestate at all. Support for it // was removed entirely. if( savever > g_SaveVersion ) @@ -336,7 +339,7 @@ protected: internals.SetDataSize( saveme.GetCurrentPos() - internals.GetDataIndex() ); m_dest_list->Add( internals ); - for (uint i=0; iFreezeOut( saveme ); @@ -527,10 +530,10 @@ protected: bool foundVersion = false; //bool foundScreenshot = false; - //bool foundEntry[numSavestateEntries] = false; + //bool foundEntry[ArraySize(SavestateEntries)] = false; std::unique_ptr foundInternal; - std::unique_ptr foundEntry[NumSavestateEntries]; + std::unique_ptr foundEntry[ArraySize(SavestateEntries)]; while(true) { @@ -561,7 +564,7 @@ protected: foundScreenshot = true; }*/ - for (uint i=0; iGetName().CmpNoCase(SavestateEntries[i]->GetFilename()) == 0) { @@ -582,7 +585,7 @@ protected: // Log any parts and pieces that are missing, and then generate an exception. bool throwIt = false; - for (uint i=0; i Date: Tue, 19 Jul 2016 18:54:56 +0200 Subject: [PATCH 2/8] gui: add a destructor to CtrlRegisterList object So we can free allocated memory --- pcsx2/gui/Debugger/CtrlRegisterList.cpp | 7 +++++++ pcsx2/gui/Debugger/CtrlRegisterList.h | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pcsx2/gui/Debugger/CtrlRegisterList.cpp b/pcsx2/gui/Debugger/CtrlRegisterList.cpp index 28ebdc0c99..82a0d827b0 100644 --- a/pcsx2/gui/Debugger/CtrlRegisterList.cpp +++ b/pcsx2/gui/Debugger/CtrlRegisterList.cpp @@ -80,6 +80,13 @@ CtrlRegisterList::CtrlRegisterList(wxWindow* parent, DebugInterface* _cpu) SetScrollbars(1, rowHeight, actualSize.x, actualSize.y / rowHeight, 0, 0); } +CtrlRegisterList::~CtrlRegisterList() +{ + for (auto& regs : changedCategories) + delete[] regs; + +} + wxSize CtrlRegisterList::getOptimalSize() const { int columnChars = 0; diff --git a/pcsx2/gui/Debugger/CtrlRegisterList.h b/pcsx2/gui/Debugger/CtrlRegisterList.h index 0f2e0f620b..cd0709ae18 100644 --- a/pcsx2/gui/Debugger/CtrlRegisterList.h +++ b/pcsx2/gui/Debugger/CtrlRegisterList.h @@ -23,14 +23,15 @@ class CtrlRegisterList: public wxScrolledWindow { public: CtrlRegisterList(wxWindow* parent, DebugInterface* _cpu); - + ~CtrlRegisterList(); + void mouseEvent(wxMouseEvent& evt); void keydownEvent(wxKeyEvent& evt); void onPopupClick(wxCommandEvent& evt); void sizeEvent(wxSizeEvent& evt); void redraw(); DECLARE_EVENT_TABLE() - + virtual wxSize GetMinClientSize() const { wxSize optimalSize = getOptimalSize(); From 3c0a97354c9b99f9d9ee00a3bf1ea31ad2fa9623 Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Tue, 19 Jul 2016 19:00:02 +0200 Subject: [PATCH 3/8] pcsx2:linux: leaking allocation isn't necessary --- pcsx2/Linux/LnxFlatFileReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pcsx2/Linux/LnxFlatFileReader.cpp b/pcsx2/Linux/LnxFlatFileReader.cpp index 1b2c6b5213..b04dac60bd 100644 --- a/pcsx2/Linux/LnxFlatFileReader.cpp +++ b/pcsx2/Linux/LnxFlatFileReader.cpp @@ -66,7 +66,7 @@ int FlatFileReader::FinishRead(void) int min_nr = 1; int max_nr = 1; - struct io_event* events = new io_event[max_nr]; + struct io_event events[max_nr]; int event = io_getevents(m_aio_context, min_nr, max_nr, events, NULL); if (event < 1) { From b322ef286e09df31b3e72452bbe0d2af345ec5a1 Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Tue, 19 Jul 2016 19:51:31 +0200 Subject: [PATCH 4/8] CDVD: initialize a temporary buffer I'm not sure to understand why Valgrind reports it as we populate the buffer during the ReadAsync. Maybe Valgrind doesn't like async IO from the kernel. In doubt, the init will avoid those warnings ==19897== Thread 6 EE Core: ==19897== Conditional jump or move depends on uninitialised value(s) ==19897== at 0x80FE9E1: BlockdumpFileReader::DetectBlockdump(AsyncFileReader*) (BlockdumpFileReader.cpp:40) ==19897== by 0x8109EE5: InputIsoFile::Open(wxString const&, bool) (InputIsoFile.cpp:229) ==19897== by 0x810939E: ISOopen(char const*) (CDVDisoReader.cpp:57) ==19897== by 0x810194E: DoCDVDopen() (CDVDaccess.cpp:359) ==19897== by 0x80B651C: SysCorePlugins::OpenPlugin_CDVD() (PluginManager.cpp:1219) --- pcsx2/CDVD/BlockdumpFileReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pcsx2/CDVD/BlockdumpFileReader.cpp b/pcsx2/CDVD/BlockdumpFileReader.cpp index b4f9f736a1..8d1b073763 100644 --- a/pcsx2/CDVD/BlockdumpFileReader.cpp +++ b/pcsx2/CDVD/BlockdumpFileReader.cpp @@ -34,7 +34,7 @@ bool BlockdumpFileReader::DetectBlockdump(AsyncFileReader* reader) reader->SetBlockSize(1); - char buf[4]; + char buf[5] = {0}; reader->ReadSync(buf, 0, 4); bool isbd = (strncmp(buf, "BDV2", 4) == 0); From b6a55f50abf83160e3c02db199b8e381a58fe670 Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Tue, 19 Jul 2016 20:15:46 +0200 Subject: [PATCH 5/8] gsdx ogl: fully initialise PSConstantBuffer structure --- plugins/GSdx/GSDeviceOGL.h | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/GSdx/GSDeviceOGL.h b/plugins/GSdx/GSDeviceOGL.h index c81b50f08d..ef6d8be4f9 100644 --- a/plugins/GSdx/GSDeviceOGL.h +++ b/plugins/GSdx/GSDeviceOGL.h @@ -203,6 +203,7 @@ public: FogColor_AREF = GSVector4::zero(); HalfTexel = GSVector4::zero(); WH = GSVector4::zero(); + TA_Af = GSVector4::zero(); MinMax = GSVector4::zero(); MskFix = GSVector4i::zero(); TC_OH_TS = GSVector4::zero(); From 1e3c46a6bba1591dc161d25001f9412b3c514a07 Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Wed, 20 Jul 2016 10:00:00 +0200 Subject: [PATCH 6/8] gsdx ogl: purge debug message in destructor Allow to see latest error and avoid noise in Valgrind log --- plugins/GSdx/GSDeviceOGL.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/GSdx/GSDeviceOGL.cpp b/plugins/GSdx/GSDeviceOGL.cpp index 8aa1533198..6bf5caf837 100644 --- a/plugins/GSdx/GSDeviceOGL.cpp +++ b/plugins/GSdx/GSDeviceOGL.cpp @@ -138,6 +138,10 @@ GSDeviceOGL::~GSDeviceOGL() // Must be done after the destruction of all shader/program objects delete m_shader; m_shader = NULL; + + // Purge any pending message to reduce noise in Valgrind (potential memory leak + // in Mesa driver that doesn't free internal buffer when the context is destroyed) + CheckDebugLog(); } void GSDeviceOGL::GenerateProfilerData() From 53a70d90182b2e372d9a2f8f5cbc381e1346655a Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Wed, 20 Jul 2016 10:06:29 +0200 Subject: [PATCH 7/8] onepad: use modal dialog instead of frame Avoid various pitfall such as #1387 v2: * use stack object --- plugins/onepad/Linux/GamepadConfiguration.cpp | 2 +- plugins/onepad/Linux/GamepadConfiguration.h | 2 +- .../onepad/Linux/JoystickConfiguration.cpp | 2 +- plugins/onepad/Linux/JoystickConfiguration.h | 2 +- plugins/onepad/Linux/dialog.cpp | 30 +++++++++++-------- plugins/onepad/Linux/dialog.h | 6 +--- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/plugins/onepad/Linux/GamepadConfiguration.cpp b/plugins/onepad/Linux/GamepadConfiguration.cpp index 6c7de1a6e9..c5a9807fb5 100644 --- a/plugins/onepad/Linux/GamepadConfiguration.cpp +++ b/plugins/onepad/Linux/GamepadConfiguration.cpp @@ -20,7 +20,7 @@ #include "GamepadConfiguration.h" // Construtor of GamepadConfiguration -GamepadConfiguration::GamepadConfiguration(int pad, wxWindow *parent) : wxFrame( +GamepadConfiguration::GamepadConfiguration(int pad, wxWindow *parent) : wxDialog( parent, // Parent wxID_ANY, // ID _T("Gamepad configuration"), // Title diff --git a/plugins/onepad/Linux/GamepadConfiguration.h b/plugins/onepad/Linux/GamepadConfiguration.h index 21b2e5737a..bec5817d83 100644 --- a/plugins/onepad/Linux/GamepadConfiguration.h +++ b/plugins/onepad/Linux/GamepadConfiguration.h @@ -32,7 +32,7 @@ #include "keyboard.h" #include "onepad.h" -class GamepadConfiguration : public wxFrame +class GamepadConfiguration : public wxDialog { wxPanel* m_pan_gamepad_config; wxCheckBox *m_cb_rumble, *m_cb_hack_sixaxis_usb, *m_cb_hack_sixaxis_pressure; diff --git a/plugins/onepad/Linux/JoystickConfiguration.cpp b/plugins/onepad/Linux/JoystickConfiguration.cpp index 104c33c7d8..6b8ddb628c 100644 --- a/plugins/onepad/Linux/JoystickConfiguration.cpp +++ b/plugins/onepad/Linux/JoystickConfiguration.cpp @@ -20,7 +20,7 @@ #include "JoystickConfiguration.h" // Construtor of JoystickConfiguration -JoystickConfiguration::JoystickConfiguration(int pad, bool left, wxWindow *parent) : wxFrame( +JoystickConfiguration::JoystickConfiguration(int pad, bool left, wxWindow *parent) : wxDialog( parent, // Parent wxID_ANY, // ID _T("Gamepad configuration"), // Title diff --git a/plugins/onepad/Linux/JoystickConfiguration.h b/plugins/onepad/Linux/JoystickConfiguration.h index 353829528f..0b3075e222 100644 --- a/plugins/onepad/Linux/JoystickConfiguration.h +++ b/plugins/onepad/Linux/JoystickConfiguration.h @@ -32,7 +32,7 @@ #include "keyboard.h" #include "onepad.h" -class JoystickConfiguration : public wxFrame +class JoystickConfiguration : public wxDialog { wxPanel* m_pan_joystick_config; wxCheckBox *m_cb_reverse_Lx, *m_cb_reverse_Ly, *m_cb_reverse_Rx, *m_cb_reverse_Ry, diff --git a/plugins/onepad/Linux/dialog.cpp b/plugins/onepad/Linux/dialog.cpp index 9e0aa9a4eb..46629ce4e9 100644 --- a/plugins/onepad/Linux/dialog.cpp +++ b/plugins/onepad/Linux/dialog.cpp @@ -20,7 +20,7 @@ #include "dialog.h" // Construtor of Dialog -Dialog::Dialog() : wxFrame( NULL, // Parent +Dialog::Dialog() : wxDialog( NULL, // Parent wxID_ANY, // ID _T("OnePad configuration"), // Title wxDefaultPosition, // Position @@ -320,21 +320,24 @@ void Dialog::OnButtonClicked(wxCommandEvent &event) } else if(bt_id == Gamepad_config) // If the button ID is equals to the Gamepad_config button ID { - m_frm_gamepad_config = new GamepadConfiguration(gamepad_id, this); - m_frm_gamepad_config->InitGamepadConfiguration(); - m_frm_gamepad_config->Show(true); + GamepadConfiguration gamepad_config(gamepad_id, this); + + gamepad_config.InitGamepadConfiguration(); + gamepad_config.ShowModal(); } else if(bt_id == JoyL_config) // If the button ID is equals to the JoyL_config button ID { - m_frm_joystick_config = new JoystickConfiguration(gamepad_id, true, this); - m_frm_joystick_config->InitJoystickConfiguration(); - m_frm_joystick_config->Show(true); + JoystickConfiguration joystick_config(gamepad_id, true, this); + + joystick_config.InitJoystickConfiguration(); + joystick_config.ShowModal(); } else if(bt_id == JoyR_config) // If the button ID is equals to the JoyR_config button ID { - m_frm_joystick_config = new JoystickConfiguration(gamepad_id, false, this); - m_frm_joystick_config->InitJoystickConfiguration(); - m_frm_joystick_config->Show(true); + JoystickConfiguration joystick_config(gamepad_id, false, this); + + joystick_config.InitJoystickConfiguration(); + joystick_config.ShowModal(); } else if(bt_id == Set_all) // If the button ID is equals to the Set_all button ID { @@ -696,7 +699,8 @@ void Dialog::repopulate() // Main void DisplayDialog() { - Dialog* dialog = new Dialog(); - dialog->InitDialog(); - dialog->Show(true); + Dialog dialog; + + dialog.InitDialog(); + dialog.ShowModal(); } diff --git a/plugins/onepad/Linux/dialog.h b/plugins/onepad/Linux/dialog.h index 765fd4e76d..ef8e5c49ad 100644 --- a/plugins/onepad/Linux/dialog.h +++ b/plugins/onepad/Linux/dialog.h @@ -63,7 +63,7 @@ enum gui_buttons { #define DEFAULT_WIDTH 1000 #define DEFAULT_HEIGHT 740 -class Dialog : public wxFrame +class Dialog : public wxDialog { // Panels opPanel* m_pan_tabs[GAMEPAD_NUMBER]; // Gamepad Tabs box @@ -80,10 +80,6 @@ class Dialog : public wxFrame // Map the key pressed with the feedback image id std::map m_map_images[GAMEPAD_NUMBER]; - // Frame - GamepadConfiguration* m_frm_gamepad_config; // Gamepad Configuration frame - JoystickConfiguration* m_frm_joystick_config; // Joystick Configuration frame - // methods void config_key(int, int); void clear_key(int, int); From 55a408edad7b60a2a74c4807af6f783e639b6f30 Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Fri, 22 Jul 2016 10:13:54 +0200 Subject: [PATCH 8/8] debugger: init resolvePointerStrings to a default value Fix valgrind issue: ==3560== Conditional jump or move depends on uninitialised value(s) ==3560== at 0x81F7949: CtrlRegisterList::OnDraw(wxDC&) (CtrlRegisterList.cpp:291) ==3560== by 0x47826DE: wxAnyScrollHelperBase::HandleOnPaint(wxPaintEvent&) (in /usr/lib/i386-linux-gnu/libwx_gtk2u_core-3.0.so.0.2.0) ==3560== by 0x4785969: wxScrollHelperEvtHandler::ProcessEvent(wxEvent&) (in /usr/lib/i386-linux-gnu/libwx_gtk2u_core-3.0.so.0.2.0) ==3560== by 0x426CA0E: wxEvtHandler::SafelyProcessEvent(wxEvent&) (in /usr/lib/i386-linux-gnu/libwx_baseu-3.0.so.0.2.0) ==3560== by 0x4710BAE: wxWindowBase::HandleWindowEvent(wxEvent&) const (in /usr/lib/i386-linux-gnu/libwx_gtk2u_core-3.0.so.0.2.0) ==3560== by 0x44EF67D: wxWindow::GTKSendPaintEvents(_GdkRegion const*) (in /usr/lib/i386-linux-gnu/libwx_gtk2u_core-3.0.so.0.2.0) --- pcsx2/gui/Debugger/CtrlRegisterList.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/pcsx2/gui/Debugger/CtrlRegisterList.cpp b/pcsx2/gui/Debugger/CtrlRegisterList.cpp index 82a0d827b0..fcc38d0120 100644 --- a/pcsx2/gui/Debugger/CtrlRegisterList.cpp +++ b/pcsx2/gui/Debugger/CtrlRegisterList.cpp @@ -52,6 +52,7 @@ CtrlRegisterList::CtrlRegisterList(wxWindow* parent, DebugInterface* _cpu) category = 0; maxBits = 128; lastPc = 0xFFFFFFFF; + resolvePointerStrings = false; for (int i = 0; i < cpu->getRegisterCategoryCount(); i++) {