diff options
author | Brian Gianforcaro <bgianf@serenityos.org> | 2021-11-29 03:06:33 -0800 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-11-30 11:16:35 +0100 |
commit | d7568b28b451098d87ce83c865152f63ae3d63e2 (patch) | |
tree | aedc25293898fdf8ca74c464e02ad6f39eb712a0 /Kernel/Process.cpp | |
parent | fa517b213a8ba9f20dc6835c159ac2e457d39a01 (diff) | |
download | serenity-d7568b28b451098d87ce83c865152f63ae3d63e2.zip |
Kernel: Surface errors when generating a process core dump :^)
Diffstat (limited to 'Kernel/Process.cpp')
-rw-r--r-- | Kernel/Process.cpp | 18 |
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(); |