summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
authorItamar <itamar8910@gmail.com>2021-12-20 22:37:19 +0200
committerBrian Gianforcaro <b.gianfo@gmail.com>2021-12-22 02:14:32 -0800
commita02d8e57101ba643c1b9978663cd43cea3caa85a (patch)
tree38345bebe9698ebacde9e0b4d4d95e254ef95b8f /Userland/Libraries
parent0cea8d13105774939b2d08d019d1e7b9f6d4ae7d (diff)
downloadserenity-a02d8e57101ba643c1b9978663cd43cea3caa85a.zip
LibDebug: Add optional setup_child() callback to debugger
If set, this callback gets called right after fork() in the child process. It can be used by the caller if it wants to perform some logic in the child process before it starts executing the debuggee program.
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibDebug/DebugSession.cpp12
-rw-r--r--Userland/Libraries/LibDebug/DebugSession.h3
2 files changed, 13 insertions, 2 deletions
diff --git a/Userland/Libraries/LibDebug/DebugSession.cpp b/Userland/Libraries/LibDebug/DebugSession.cpp
index 487132c2d2..b715a1620d 100644
--- a/Userland/Libraries/LibDebug/DebugSession.cpp
+++ b/Userland/Libraries/LibDebug/DebugSession.cpp
@@ -53,7 +53,9 @@ void DebugSession::for_each_loaded_library(Function<IterationDecision(LoadedLibr
}
}
-OwnPtr<DebugSession> DebugSession::exec_and_attach(String const& command, String source_root)
+OwnPtr<DebugSession> DebugSession::exec_and_attach(String const& command,
+ String source_root,
+ Function<ErrorOr<void>()> setup_child)
{
auto pid = fork();
@@ -63,6 +65,14 @@ OwnPtr<DebugSession> DebugSession::exec_and_attach(String const& command, String
}
if (!pid) {
+
+ if (setup_child) {
+ if (setup_child().is_error()) {
+ perror("DebugSession::setup_child");
+ exit(1);
+ }
+ }
+
if (ptrace(PT_TRACE_ME, 0, 0, 0) < 0) {
perror("PT_TRACE_ME");
exit(1);
diff --git a/Userland/Libraries/LibDebug/DebugSession.h b/Userland/Libraries/LibDebug/DebugSession.h
index 0949ca47f7..eaffaa82c4 100644
--- a/Userland/Libraries/LibDebug/DebugSession.h
+++ b/Userland/Libraries/LibDebug/DebugSession.h
@@ -7,6 +7,7 @@
#pragma once
#include <AK/Demangle.h>
+#include <AK/Function.h>
#include <AK/HashMap.h>
#include <AK/NonnullRefPtr.h>
#include <AK/Optional.h>
@@ -26,7 +27,7 @@ namespace Debug {
class DebugSession : public ProcessInspector {
public:
- static OwnPtr<DebugSession> exec_and_attach(String const& command, String source_root = {});
+ static OwnPtr<DebugSession> exec_and_attach(String const& command, String source_root = {}, Function<ErrorOr<void>()> setup_child = {});
virtual ~DebugSession() override;