From: ASOU Masato Subject: Re: lldb: fails to read a process core file (regression) To: YASUOKA Masahiko , Yuichiro NAITO Cc: asou@openbsd.org, tech@openbsd.org Date: Thu, 1 Aug 2024 10:47:24 +0900 Thank Yuichiro. I was tested this patch on my AMD box to investigate kernel core and process core. And it's work fine for me. Committed OpenBSD CVS. -- ASOU Masato 2024年7月31日(水) 17:31 YASUOKA Masahiko : > > Asou-san, > > Can you handle this? > > ok yasuoka > > On Wed, 31 Jul 2024 16:38:25 +0900 (JST) > Yuichiro NAITO wrote: > > I received a mail personally that reports lldb fails to read a process core > > file. It's a regression of my kernel core file support patch. My apologies. > > > > The ProcessOpenBSDKernel class opens a core file via kvm_open(3). > > The kvm_open(3) succeeds in opening a core file even if it is a process core. > > So the OpenBSDKernel plugin is used for a process core file but can't analyze > > it. > > > > If a process core file is passed to the ProcessOpenBSDKernel class, its > > instantiation should fail. A process core file is an ELF binary. I add > > the check logic to see whether an ELF binary or not and make it fail > > instantiation in case of an ELF binary. > > > > OK? > > > > diff --git a/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/ProcessOpenBSDKernel.cpp b/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/ProcessOpenBSDKernel.cpp > > index 300a35d4051..8016399586f 100644 > > --- a/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/ProcessOpenBSDKernel.cpp > > +++ b/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/ProcessOpenBSDKernel.cpp > > @@ -19,6 +19,7 @@ > > #define _KERNEL > > #include > > #include > > +#include > > #undef _KERNEL > > #endif > > > > @@ -60,6 +61,14 @@ lldb::ProcessSP ProcessOpenBSDKernel::CreateInstance(lldb::TargetSP target_sp, > > ModuleSP executable = target_sp->GetExecutableModule(); > > if (crash_file && !can_connect && executable) { > > #if defined(__OpenBSD__) > > + char buf[4]; > > + FILE *fp = fopen(crash_file->GetPath().c_str(), "r"); > > + if (fp == NULL) > > + return nullptr; > > + size_t r = fread(buf, 1, sizeof(buf), fp); > > + fclose(fp); > > + if (r != sizeof(buf) || memcmp(buf, ELFMAG, sizeof(buf)) == 0) > > + return nullptr; > > kvm_t *kvm = > > kvm_open(executable->GetFileSpec().GetPath().c_str(), > > crash_file->GetPath().c_str(), nullptr, O_RDONLY, nullptr); > > > > -- > > Yuichiro NAITO (naito.yuichiro@gmail.com) > > > > >