summaryrefslogtreecommitdiff
path: root/Kernel/Process.cpp
diff options
context:
space:
mode:
authorBrian Gianforcaro <bgianf@serenityos.org>2021-11-29 03:06:33 -0800
committerAndreas Kling <kling@serenityos.org>2021-11-30 11:16:35 +0100
commitd7568b28b451098d87ce83c865152f63ae3d63e2 (patch)
treeaedc25293898fdf8ca74c464e02ad6f39eb712a0 /Kernel/Process.cpp
parentfa517b213a8ba9f20dc6835c159ac2e457d39a01 (diff)
downloadserenity-d7568b28b451098d87ce83c865152f63ae3d63e2.zip
Kernel: Surface errors when generating a process core dump :^)
Diffstat (limited to 'Kernel/Process.cpp')
-rw-r--r--Kernel/Process.cpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp
index cf837a7c7a..117cbb33bb 100644
--- a/Kernel/Process.cpp
+++ b/Kernel/Process.cpp
@@ -541,16 +541,14 @@ ErrorOr<NonnullOwnPtr<KString>> Process::get_syscall_path_argument(Syscall::Stri
return get_syscall_path_argument(path_characters, path.length);
}
-bool Process::dump_core()
+ErrorOr<void> Process::dump_core()
{
VERIFY(is_dumpable());
VERIFY(should_generate_coredump());
dbgln("Generating coredump for pid: {}", pid().value());
- auto coredump_path = String::formatted("/tmp/coredump/{}_{}_{}", name(), pid().value(), kgettimeofday().to_truncated_seconds());
- auto coredump_or_error = Coredump::try_create(*this, coredump_path);
- if (coredump_or_error.is_error())
- return false;
- return !coredump_or_error.value()->write().is_error();
+ auto coredump_path = TRY(KString::formatted("/tmp/coredump/{}_{}_{}", name(), pid().value(), kgettimeofday().to_truncated_seconds()));
+ auto coredump = TRY(Coredump::try_create(*this, coredump_path->view()));
+ return coredump->write();
}
bool Process::dump_perfcore()
@@ -612,8 +610,12 @@ void Process::finalize()
dbgln("\x1b[01;31mProcess '{}' exited with the veil left open\x1b[0m", name());
if (is_dumpable()) {
- if (m_should_generate_coredump)
- dump_core();
+ if (m_should_generate_coredump) {
+ auto result = dump_core();
+ if (result.is_error()) {
+ critical_dmesgln("Failed to write coredump: {}", result.error());
+ }
+ }
if (m_perf_event_buffer) {
dump_perfcore();
TimeManagement::the().disable_profile_timer();