diff --git a/Kernel/CoreDump.cpp b/Kernel/CoreDump.cpp index e65c64e47c..5e44b33e61 100644 --- a/Kernel/CoreDump.cpp +++ b/Kernel/CoreDump.cpp @@ -40,9 +40,9 @@ namespace Kernel { -OwnPtr CoreDump::create(Process& process) +OwnPtr CoreDump::create(Process& process, const LexicalPath& output_path) { - auto fd = create_target_file(process); + auto fd = create_target_file(process, output_path); if (!fd) return nullptr; return make(process, fd.release_nonnull()); @@ -59,19 +59,19 @@ CoreDump::~CoreDump() { } -RefPtr CoreDump::create_target_file(const Process& process) +RefPtr CoreDump::create_target_file(const Process& process, const LexicalPath& output_path) { - static constexpr const char* coredumps_directory = "/tmp/coredump"; - if (VFS::the().open_directory(coredumps_directory, VFS::the().root_custody()).is_error()) { - auto res = VFS::the().mkdir(coredumps_directory, 0777, VFS::the().root_custody()); + auto output_directory = output_path.dirname(); + if (VFS::the().open_directory(output_directory, VFS::the().root_custody()).is_error()) { + auto res = VFS::the().mkdir(output_directory, 0777, VFS::the().root_custody()); if (res.is_error()) return nullptr; } - auto tmp_dir = VFS::the().open_directory(coredumps_directory, VFS::the().root_custody()); + auto tmp_dir = VFS::the().open_directory(output_directory, VFS::the().root_custody()); if (tmp_dir.is_error()) return nullptr; auto fd_or_error = VFS::the().open( - String::format("%s_%u.core", process.name().characters(), RTC::now()), + output_path.basename(), O_CREAT | O_WRONLY | O_EXCL, 0, // We will enable reading from userspace when we finish generating the coredump file *tmp_dir.value(), diff --git a/Kernel/CoreDump.h b/Kernel/CoreDump.h index edc62c346f..20e5df51f4 100644 --- a/Kernel/CoreDump.h +++ b/Kernel/CoreDump.h @@ -27,6 +27,7 @@ #pragma once +#include #include #include #include @@ -38,7 +39,7 @@ class Process; class CoreDump { public: - static OwnPtr create(Process&); + static OwnPtr create(Process&, const LexicalPath& output_path); ~CoreDump(); void write(); @@ -47,7 +48,7 @@ public: CoreDump(Process&, NonnullRefPtr&&); private: - static RefPtr create_target_file(const Process&); + static RefPtr create_target_file(const Process&, const LexicalPath& output_path); void write_elf_header(); void write_program_headers(size_t notes_size); diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 1f45624593..507be3901f 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -589,7 +589,9 @@ void Process::finalize() if (m_should_dump_core) { dbgln("Generating coredump for pid: {}", m_pid.value()); - auto coredump = CoreDump::create(*this); + + auto coredump_path = String::format("/tmp/coredump/%s_%u", name().characters(), RTC::now()); + auto coredump = CoreDump::create(*this, LexicalPath { coredump_path }); if (!coredump) { dbgln("Could not create coredump"); } diff --git a/Kernel/Syscalls/profiling.cpp b/Kernel/Syscalls/profiling.cpp index 1665222ea2..89f1d4ad0b 100644 --- a/Kernel/Syscalls/profiling.cpp +++ b/Kernel/Syscalls/profiling.cpp @@ -24,6 +24,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include