summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/DevTools/HackStudio/Debugger/Debugger.cpp8
-rw-r--r--Userland/DevTools/HackStudio/Debugger/Debugger.h3
-rw-r--r--Userland/DevTools/HackStudio/HackStudioWidget.cpp14
3 files changed, 24 insertions, 1 deletions
diff --git a/Userland/DevTools/HackStudio/Debugger/Debugger.cpp b/Userland/DevTools/HackStudio/Debugger/Debugger.cpp
index 4f2a4c6447..b2464e8e54 100644
--- a/Userland/DevTools/HackStudio/Debugger/Debugger.cpp
+++ b/Userland/DevTools/HackStudio/Debugger/Debugger.cpp
@@ -112,7 +112,13 @@ void Debugger::stop()
void Debugger::start()
{
- m_debug_session = Debug::DebugSession::exec_and_attach(m_executable_path, m_source_root);
+
+ auto child_setup_callback = [this]() {
+ if (m_child_setup_callback)
+ return m_child_setup_callback();
+ return ErrorOr<void> {};
+ };
+ m_debug_session = Debug::DebugSession::exec_and_attach(m_executable_path, m_source_root, move(child_setup_callback));
VERIFY(!!m_debug_session);
for (const auto& breakpoint : m_breakpoints) {
diff --git a/Userland/DevTools/HackStudio/Debugger/Debugger.h b/Userland/DevTools/HackStudio/Debugger/Debugger.h
index 1ef6f67bc4..eca9d30b76 100644
--- a/Userland/DevTools/HackStudio/Debugger/Debugger.h
+++ b/Userland/DevTools/HackStudio/Debugger/Debugger.h
@@ -60,6 +60,8 @@ public:
void set_requested_debugger_action(DebuggerAction);
void reset_breakpoints() { m_breakpoints.clear(); }
+ void set_child_setup_callback(Function<ErrorOr<void>()> callback) { m_child_setup_callback = move(callback); }
+
private:
class DebuggingState {
public:
@@ -119,6 +121,7 @@ private:
Function<HasControlPassedToUser(const PtraceRegisters&)> m_on_stopped_callback;
Function<void()> m_on_continue_callback;
Function<void()> m_on_exit_callback;
+ Function<ErrorOr<void>()> m_child_setup_callback;
};
}
diff --git a/Userland/DevTools/HackStudio/HackStudioWidget.cpp b/Userland/DevTools/HackStudio/HackStudioWidget.cpp
index 320fdcca98..63977a92d4 100644
--- a/Userland/DevTools/HackStudio/HackStudioWidget.cpp
+++ b/Userland/DevTools/HackStudio/HackStudioWidget.cpp
@@ -797,6 +797,20 @@ NonnullRefPtr<GUI::Action> HackStudioWidget::create_debug_action()
}
Debugger::the().set_executable_path(get_project_executable_path());
+
+ m_terminal_wrapper->clear_including_history();
+
+ // The debugger calls wait() on the debugee, so the TerminalWrapper can't do that.
+ auto ptm_res = m_terminal_wrapper->setup_master_pseudoterminal(TerminalWrapper::WaitForChildOnExit::No);
+ if (ptm_res.is_error()) {
+ perror("setup_master_pseudoterminal");
+ return;
+ }
+
+ Debugger::the().set_child_setup_callback([this, ptm_res]() {
+ return m_terminal_wrapper->setup_slave_pseudoterminal(ptm_res.value());
+ });
+
m_debugger_thread = Threading::Thread::construct(Debugger::start_static);
m_debugger_thread->start();
m_stop_action->set_enabled(true);