Qt/debugger: properly updates when we break

The Host_UpdateDisasmDialog was unimplemented in Qt which is required to get updates when we break.  Additionally, this updates the debugger toolbar.
This commit is contained in:
aldelaro5 2018-05-05 18:17:06 -04:00
parent 70ca98c8e7
commit 238c801711
No known key found for this signature in database
GPG Key ID: 054DD3E6FF48DB71
9 changed files with 80 additions and 29 deletions

View File

@ -206,7 +206,9 @@ void BreakpointWidget::OnDelete()
auto address = m_table->selectedItems()[0]->data(Qt::UserRole).toUInt(); auto address = m_table->selectedItems()[0]->data(Qt::UserRole).toUInt();
PowerPC::breakpoints.Remove(address); PowerPC::breakpoints.Remove(address);
Settings::Instance().blockSignals(true);
PowerPC::memchecks.Remove(address); PowerPC::memchecks.Remove(address);
Settings::Instance().blockSignals(false);
Update(); Update();
} }
@ -214,7 +216,9 @@ void BreakpointWidget::OnDelete()
void BreakpointWidget::OnClear() void BreakpointWidget::OnClear()
{ {
PowerPC::debug_interface.ClearAllBreakpoints(); PowerPC::debug_interface.ClearAllBreakpoints();
Settings::Instance().blockSignals(true);
PowerPC::debug_interface.ClearAllMemChecks(); PowerPC::debug_interface.ClearAllMemChecks();
Settings::Instance().blockSignals(false);
m_table->setRowCount(0); m_table->setRowCount(0);
Update(); Update();
@ -247,7 +251,9 @@ void BreakpointWidget::OnLoad()
if (ini.GetLines("MemoryBreakPoints", &newmcs, false)) if (ini.GetLines("MemoryBreakPoints", &newmcs, false))
{ {
PowerPC::memchecks.Clear(); PowerPC::memchecks.Clear();
Settings::Instance().blockSignals(true);
PowerPC::memchecks.AddFromStrings(newmcs); PowerPC::memchecks.AddFromStrings(newmcs);
Settings::Instance().blockSignals(false);
} }
Update(); Update();
@ -283,7 +289,9 @@ void BreakpointWidget::AddAddressMBP(u32 addr, bool on_read, bool on_write, bool
check.log_on_hit = do_log; check.log_on_hit = do_log;
check.break_on_hit = do_break; check.break_on_hit = do_break;
Settings::Instance().blockSignals(true);
PowerPC::memchecks.Add(check); PowerPC::memchecks.Add(check);
Settings::Instance().blockSignals(false);
Update(); Update();
} }
@ -301,7 +309,9 @@ void BreakpointWidget::AddRangedMBP(u32 from, u32 to, bool on_read, bool on_writ
check.log_on_hit = do_log; check.log_on_hit = do_log;
check.break_on_hit = do_break; check.break_on_hit = do_break;
Settings::Instance().blockSignals(true);
PowerPC::memchecks.Add(check); PowerPC::memchecks.Add(check);
Settings::Instance().blockSignals(false);
Update(); Update();
} }

View File

@ -187,12 +187,13 @@ u32 CodeViewWidget::GetAddress() const
return m_address; return m_address;
} }
void CodeViewWidget::SetAddress(u32 address) void CodeViewWidget::SetAddress(u32 address, SetAddressUpdate update)
{ {
if (m_address == address) if (m_address == address)
return; return;
m_address = address; m_address = address;
if (update == SetAddressUpdate::WithUpdate)
Update(); Update();
} }
@ -367,7 +368,7 @@ void CodeViewWidget::OnFollowBranch()
if (!branch_addr) if (!branch_addr)
return; return;
SetAddress(branch_addr); SetAddress(branch_addr, SetAddressUpdate::WithUpdate);
} }
void CodeViewWidget::OnRenameSymbol() void CodeViewWidget::OnRenameSymbol()
@ -533,7 +534,7 @@ void CodeViewWidget::mousePressEvent(QMouseEvent* event)
if (column(item) == 0) if (column(item) == 0)
ToggleBreakpoint(); ToggleBreakpoint();
else else
SetAddress(addr); SetAddress(addr, SetAddressUpdate::WithUpdate);
Update(); Update();
break; break;

View File

@ -18,11 +18,17 @@ class CodeViewWidget : public QTableWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
enum class SetAddressUpdate
{
WithUpdate,
WithoutUpdate
};
explicit CodeViewWidget(); explicit CodeViewWidget();
u32 GetAddress() const; u32 GetAddress() const;
u32 GetContextAddress() const; u32 GetContextAddress() const;
void SetAddress(u32 address); void SetAddress(u32 address, SetAddressUpdate update);
void Update(); void Update();

View File

@ -21,7 +21,7 @@
#include "Core/HW/CPU.h" #include "Core/HW/CPU.h"
#include "Core/PowerPC/PPCSymbolDB.h" #include "Core/PowerPC/PPCSymbolDB.h"
#include "Core/PowerPC/PowerPC.h" #include "Core/PowerPC/PowerPC.h"
#include "DolphinQt2/Debugger/CodeViewWidget.h" #include "DolphinQt2/Host.h"
#include "DolphinQt2/Settings.h" #include "DolphinQt2/Settings.h"
CodeWidget::CodeWidget(QWidget* parent) : QDockWidget(parent) CodeWidget::CodeWidget(QWidget* parent) : QDockWidget(parent)
@ -39,6 +39,12 @@ CodeWidget::CodeWidget(QWidget* parent) : QDockWidget(parent)
connect(&Settings::Instance(), &Settings::CodeVisibilityChanged, connect(&Settings::Instance(), &Settings::CodeVisibilityChanged,
[this](bool visible) { setHidden(!visible); }); [this](bool visible) { setHidden(!visible); });
connect(Host::GetInstance(), &Host::UpdateDisasmDialog, this, [this] {
if (Core::GetState() == Core::State::Paused)
SetAddress(PowerPC::ppcState.pc, CodeViewWidget::SetAddressUpdate::WithoutUpdate);
Update();
});
connect(&Settings::Instance(), &Settings::DebugModeToggled, connect(&Settings::Instance(), &Settings::DebugModeToggled,
[this](bool enabled) { setHidden(!enabled || !Settings::Instance().IsCodeVisible()); }); [this](bool enabled) { setHidden(!enabled || !Settings::Instance().IsCodeVisible()); });
@ -175,7 +181,7 @@ void CodeWidget::OnSearchAddress()
m_search_address->setFont(font); m_search_address->setFont(font);
if (good) if (good)
m_code_view->SetAddress(address); m_code_view->SetAddress(address, CodeViewWidget::SetAddressUpdate::WithUpdate);
Update(); Update();
} }
@ -194,7 +200,8 @@ void CodeWidget::OnSelectSymbol()
Symbol* symbol = g_symbolDB.GetSymbolFromAddr(items[0]->data(Qt::UserRole).toUInt()); Symbol* symbol = g_symbolDB.GetSymbolFromAddr(items[0]->data(Qt::UserRole).toUInt());
m_code_view->SetAddress(items[0]->data(Qt::UserRole).toUInt()); m_code_view->SetAddress(items[0]->data(Qt::UserRole).toUInt(),
CodeViewWidget::SetAddressUpdate::WithUpdate);
UpdateCallstack(); UpdateCallstack();
UpdateFunctionCalls(symbol); UpdateFunctionCalls(symbol);
UpdateFunctionCallers(symbol); UpdateFunctionCallers(symbol);
@ -208,7 +215,8 @@ void CodeWidget::OnSelectCallstack()
if (items.isEmpty()) if (items.isEmpty())
return; return;
m_code_view->SetAddress(items[0]->data(Qt::UserRole).toUInt()); m_code_view->SetAddress(items[0]->data(Qt::UserRole).toUInt(),
CodeViewWidget::SetAddressUpdate::WithUpdate);
Update(); Update();
} }
@ -218,7 +226,8 @@ void CodeWidget::OnSelectFunctionCalls()
if (items.isEmpty()) if (items.isEmpty())
return; return;
m_code_view->SetAddress(items[0]->data(Qt::UserRole).toUInt()); m_code_view->SetAddress(items[0]->data(Qt::UserRole).toUInt(),
CodeViewWidget::SetAddressUpdate::WithUpdate);
Update(); Update();
} }
@ -228,10 +237,16 @@ void CodeWidget::OnSelectFunctionCallers()
if (items.isEmpty()) if (items.isEmpty())
return; return;
m_code_view->SetAddress(items[0]->data(Qt::UserRole).toUInt()); m_code_view->SetAddress(items[0]->data(Qt::UserRole).toUInt(),
CodeViewWidget::SetAddressUpdate::WithUpdate);
Update(); Update();
} }
void CodeWidget::SetAddress(u32 address, CodeViewWidget::SetAddressUpdate update)
{
m_code_view->SetAddress(address, update);
}
void CodeWidget::Update() void CodeWidget::Update()
{ {
Symbol* symbol = g_symbolDB.GetSymbolFromAddr(m_code_view->GetAddress()); Symbol* symbol = g_symbolDB.GetSymbolFromAddr(m_code_view->GetAddress());
@ -239,14 +254,14 @@ void CodeWidget::Update()
UpdateCallstack(); UpdateCallstack();
UpdateSymbols(); UpdateSymbols();
m_code_view->Update();
m_code_view->setFocus();
if (!symbol) if (!symbol)
return; return;
UpdateFunctionCalls(symbol); UpdateFunctionCalls(symbol);
UpdateFunctionCallers(symbol); UpdateFunctionCallers(symbol);
m_code_view->Update();
m_code_view->setFocus();
} }
void CodeWidget::UpdateCallstack() void CodeWidget::UpdateCallstack()
@ -358,10 +373,7 @@ void CodeWidget::Step()
sync_event.WaitFor(std::chrono::milliseconds(20)); sync_event.WaitFor(std::chrono::milliseconds(20));
PowerPC::SetMode(old_mode); PowerPC::SetMode(old_mode);
Core::DisplayMessage(tr("Step successful!").toStdString(), 2000); Core::DisplayMessage(tr("Step successful!").toStdString(), 2000);
// Will get a UpdateDisasmDialog(), don't update the GUI here.
Core::SetState(Core::State::Paused);
m_code_view->SetAddress(PC);
Update();
} }
void CodeWidget::StepOver() void CodeWidget::StepOver()
@ -381,10 +393,6 @@ void CodeWidget::StepOver()
{ {
Step(); Step();
} }
Core::SetState(Core::State::Paused);
m_code_view->SetAddress(PC);
Update();
} }
// Returns true on a rfi, blr or on a bclr that evaluates to true. // Returns true on a rfi, blr or on a bclr that evaluates to true.
@ -404,7 +412,6 @@ void CodeWidget::StepOut()
if (!CPU::IsStepping()) if (!CPU::IsStepping())
return; return;
Core::SetState(Core::State::Running);
CPU::PauseAndLock(true, false); CPU::PauseAndLock(true, false);
PowerPC::breakpoints.ClearAllTemporary(); PowerPC::breakpoints.ClearAllTemporary();
@ -447,16 +454,14 @@ void CodeWidget::StepOut()
PowerPC::SetMode(old_mode); PowerPC::SetMode(old_mode);
CPU::PauseAndLock(false, false); CPU::PauseAndLock(false, false);
emit Host::GetInstance()->UpdateDisasmDialog();
if (PowerPC::breakpoints.IsAddressBreakPoint(PC)) if (PowerPC::breakpoints.IsAddressBreakPoint(PC))
Core::DisplayMessage(tr("Breakpoint encountered! Step out aborted.").toStdString(), 2000); Core::DisplayMessage(tr("Breakpoint encountered! Step out aborted.").toStdString(), 2000);
else if (clock::now() >= timeout) else if (clock::now() >= timeout)
Core::DisplayMessage(tr("Step out timed out!").toStdString(), 2000); Core::DisplayMessage(tr("Step out timed out!").toStdString(), 2000);
else else
Core::DisplayMessage(tr("Step out successful!").toStdString(), 2000); Core::DisplayMessage(tr("Step out successful!").toStdString(), 2000);
Core::SetState(Core::State::Paused);
m_code_view->SetAddress(PC);
Update();
} }
void CodeWidget::Skip() void CodeWidget::Skip()
@ -467,7 +472,7 @@ void CodeWidget::Skip()
void CodeWidget::ShowPC() void CodeWidget::ShowPC()
{ {
m_code_view->SetAddress(PC); m_code_view->SetAddress(PC, CodeViewWidget::SetAddressUpdate::WithUpdate);
Update(); Update();
} }

View File

@ -8,8 +8,8 @@
#include <QString> #include <QString>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "DolphinQt2/Debugger/CodeViewWidget.h"
class CodeViewWidget;
class QCloseEvent; class QCloseEvent;
class QLineEdit; class QLineEdit;
class QSplitter; class QSplitter;
@ -33,6 +33,7 @@ public:
void ToggleBreakpoint(); void ToggleBreakpoint();
void AddBreakpoint(); void AddBreakpoint();
void SetAddress(u32 address, CodeViewWidget::SetAddressUpdate update);
void Update(); void Update();
signals: signals:

View File

@ -14,6 +14,7 @@
#include "Core/Debugger/PPCDebugInterface.h" #include "Core/Debugger/PPCDebugInterface.h"
#include "Core/Host.h" #include "Core/Host.h"
#include "Core/PowerPC/PowerPC.h" #include "Core/PowerPC/PowerPC.h"
#include "DolphinQt2/QtUtils/RunOnObject.h"
#include "DolphinQt2/Settings.h" #include "DolphinQt2/Settings.h"
#include "VideoCommon/RenderBase.h" #include "VideoCommon/RenderBase.h"
#include "VideoCommon/VideoConfig.h" #include "VideoCommon/VideoConfig.h"
@ -109,6 +110,10 @@ void Host_YieldToUI()
void Host_UpdateDisasmDialog() void Host_UpdateDisasmDialog()
{ {
RunOnObject(QApplication::instance(), [&] {
emit Host::GetInstance()->UpdateDisasmDialog();
return true;
});
} }
void Host_UpdateProgressDialog(const char* caption, int position, int total) void Host_UpdateProgressDialog(const char* caption, int position, int total)

View File

@ -33,6 +33,7 @@ signals:
void RequestStop(); void RequestStop();
void RequestRenderSize(int w, int h); void RequestRenderSize(int w, int h);
void UpdateProgressDialog(QString label, int position, int maximum); void UpdateProgressDialog(QString label, int position, int maximum);
void UpdateDisasmDialog();
private: private:
Host(); Host();

View File

@ -46,6 +46,7 @@
#include "DiscIO/WiiSaveBanner.h" #include "DiscIO/WiiSaveBanner.h"
#include "DolphinQt2/AboutDialog.h" #include "DolphinQt2/AboutDialog.h"
#include "DolphinQt2/Host.h"
#include "DolphinQt2/QtUtils/ActionHelper.h" #include "DolphinQt2/QtUtils/ActionHelper.h"
#include "DolphinQt2/Settings.h" #include "DolphinQt2/Settings.h"
@ -65,6 +66,9 @@ MenuBar::MenuBar(QWidget* parent) : QMenuBar(parent)
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
[=](Core::State state) { OnEmulationStateChanged(state); }); [=](Core::State state) { OnEmulationStateChanged(state); });
connect(Host::GetInstance(), &Host::UpdateDisasmDialog, this,
[this] { OnEmulationStateChanged(Core::GetState()); });
OnEmulationStateChanged(Core::GetState()); OnEmulationStateChanged(Core::GetState());
connect(&Settings::Instance(), &Settings::DebugModeToggled, this, &MenuBar::OnDebugModeToggled); connect(&Settings::Instance(), &Settings::DebugModeToggled, this, &MenuBar::OnDebugModeToggled);

View File

@ -8,6 +8,7 @@
#include <QIcon> #include <QIcon>
#include "Core/Core.h" #include "Core/Core.h"
#include "DolphinQt2/Host.h"
#include "DolphinQt2/QtUtils/ActionHelper.h" #include "DolphinQt2/QtUtils/ActionHelper.h"
#include "DolphinQt2/Resources.h" #include "DolphinQt2/Resources.h"
#include "DolphinQt2/Settings.h" #include "DolphinQt2/Settings.h"
@ -33,6 +34,9 @@ ToolBar::ToolBar(QWidget* parent) : QToolBar(parent)
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
[this](Core::State state) { OnEmulationStateChanged(state); }); [this](Core::State state) { OnEmulationStateChanged(state); });
connect(Host::GetInstance(), &Host::UpdateDisasmDialog, this,
[this] { OnEmulationStateChanged(Core::GetState()); });
connect(&Settings::Instance(), &Settings::DebugModeToggled, this, &ToolBar::OnDebugModeToggled); connect(&Settings::Instance(), &Settings::DebugModeToggled, this, &ToolBar::OnDebugModeToggled);
connect(&Settings::Instance(), &Settings::ToolBarVisibilityChanged, this, &ToolBar::setVisible); connect(&Settings::Instance(), &Settings::ToolBarVisibilityChanged, this, &ToolBar::setVisible);
@ -56,6 +60,13 @@ void ToolBar::OnEmulationStateChanged(Core::State state)
m_play_action->setVisible(!playing); m_play_action->setVisible(!playing);
m_pause_action->setEnabled(playing); m_pause_action->setEnabled(playing);
m_pause_action->setVisible(playing); m_pause_action->setVisible(playing);
bool paused = Core::GetState() == Core::State::Paused;
m_step_action->setEnabled(paused);
m_step_over_action->setEnabled(paused);
m_step_out_action->setEnabled(paused);
m_skip_action->setEnabled(paused);
m_set_pc_action->setEnabled(paused);
} }
void ToolBar::closeEvent(QCloseEvent*) void ToolBar::closeEvent(QCloseEvent*)
@ -71,6 +82,13 @@ void ToolBar::OnDebugModeToggled(bool enabled)
m_skip_action->setVisible(enabled); m_skip_action->setVisible(enabled);
m_show_pc_action->setVisible(enabled); m_show_pc_action->setVisible(enabled);
m_set_pc_action->setVisible(enabled); m_set_pc_action->setVisible(enabled);
bool paused = Core::GetState() == Core::State::Paused;
m_step_action->setEnabled(paused);
m_step_over_action->setEnabled(paused);
m_step_out_action->setEnabled(paused);
m_skip_action->setEnabled(paused);
m_set_pc_action->setEnabled(paused);
} }
void ToolBar::MakeActions() void ToolBar::MakeActions()