diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 507be3901f..64745ee41e 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -587,15 +587,24 @@ void Process::finalize() dbg() << "Finalizing process " << *this; #endif + if (is_profiling()) { + auto coredump = CoreDump::create(*this, LexicalPath { String::format("/tmp/profiler_coredumps/%d", pid().value()) }); + if (coredump) { + coredump->write(); + } else { + dbgln("Could not create coredump"); + } + } if (m_should_dump_core) { dbgln("Generating coredump for pid: {}", m_pid.value()); - auto coredump_path = String::format("/tmp/coredump/%s_%u", name().characters(), RTC::now()); + auto coredump_path = String::format("/tmp/coredump/%s_%d_%u", name().characters(), m_pid.value(), RTC::now()); auto coredump = CoreDump::create(*this, LexicalPath { coredump_path }); - if (!coredump) { + if (coredump) { + coredump->write(); + } else { dbgln("Could not create coredump"); } - coredump->write(); } if (m_perf_event_buffer) { diff --git a/Kernel/Syscalls/profiling.cpp b/Kernel/Syscalls/profiling.cpp index 89f1d4ad0b..cb6ded68f4 100644 --- a/Kernel/Syscalls/profiling.cpp +++ b/Kernel/Syscalls/profiling.cpp @@ -56,6 +56,12 @@ int Process::sys$profiling_disable(pid_t pid) return -EPERM; process->set_profiling(false); Profiling::stop(); + + // We explicitly unlock here because we can't hold the lock when writing the coredump VFS + lock.unlock(); + + auto coredump = CoreDump::create(*process, LexicalPath { String::format("/tmp/profiler_coredumps/%d", pid) }); + coredump->write(); return 0; }