From a933d5179e411f40059a3711c9a09559b4acb62d Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Tue, 5 Apr 2016 13:07:16 +0000 Subject: [PATCH] Fix a bug in linux core file handling Summary: There was a bug in linux core file handling, where if there was a running process with the same process id as the id in the core file, the core file debugging would fail, as we would pull some pieces of information (ProcessInfo structure) from the running process instead of the core file. I fix this by routing the ProcessInfo requests through the Process class and overriding it in ProcessElfCore to return correct data. A (slightly convoluted) test is included. Reviewers: clayborg, zturner Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D18697 llvm-svn: 265391 --- lldb/include/lldb/Target/Process.h | 3 + .../postmortem/linux-core/TestLinuxCore.py | 63 ++++++++++++++++++--- .../postmortem/linux-core/altmain.c | 6 ++ .../postmortem/linux-core/altmain.core | Bin 0 -> 40960 bytes .../postmortem/linux-core/altmain.out | Bin 0 -> 2330 bytes .../postmortem/linux-core/make-core.sh | 10 +++- .../POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp | 2 +- .../Plugins/Process/elf-core/ProcessElfCore.cpp | 15 +++++ .../Plugins/Process/elf-core/ProcessElfCore.h | 3 + lldb/source/Target/Process.cpp | 14 ++++- 10 files changed, 106 insertions(+), 10 deletions(-) create mode 100644 lldb/packages/Python/lldbsuite/test/functionalities/postmortem/linux-core/altmain.c create mode 100644 lldb/packages/Python/lldbsuite/test/functionalities/postmortem/linux-core/altmain.core create mode 100755 lldb/packages/Python/lldbsuite/test/functionalities/postmortem/linux-core/altmain.out diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h index c6abc67..fd483f0 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -1961,6 +1961,9 @@ public: void PrintWarningOptimization (const SymbolContext &sc); + virtual bool + GetProcessInfo(ProcessInstanceInfo &info); + public: //------------------------------------------------------------------ /// Get the exit status for a process. diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/linux-core/TestLinuxCore.py b/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/linux-core/TestLinuxCore.py index 3efd3ec..5eb33d0 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/linux-core/TestLinuxCore.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/linux-core/TestLinuxCore.py @@ -4,29 +4,78 @@ Test basics of linux core file debugging. from __future__ import print_function +import shutil +import struct + import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class LinuxCoreTestCase(TestBase): + NO_DEBUG_INFO_TESTCASE = True mydir = TestBase.compute_mydir(__file__) + _i386_pid = 32306 + _x86_64_pid = 32259 + @skipIf(bugnumber="llvm.org/pr26947") - @no_debug_info_test def test_i386(self): """Test that lldb can read the process information from an i386 linux core file.""" - self.do_test("i386", 32306) + self.do_test("i386", self._i386_pid) - @no_debug_info_test def test_x86_64(self): """Test that lldb can read the process information from an x86_64 linux core file.""" - self.do_test("x86_64", 32259) + self.do_test("x86_64", self._x86_64_pid) + + def test_same_pid_running(self): + """Test that we read the information from the core correctly even if we have a running + process with the same PID around""" + try: + shutil.copyfile("x86_64.out", "x86_64-pid.out") + shutil.copyfile("x86_64.core", "x86_64-pid.core") + with open("x86_64-pid.core", "r+b") as f: + # These are offsets into the NT_PRSTATUS and NT_PRPSINFO structures in the note + # segment of the core file. If you update the file, these offsets may need updating + # as well. (Notes can be viewed with readelf --notes.) + for pid_offset in [0x1c4, 0x320]: + f.seek(pid_offset) + self.assertEqual(struct.unpack("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 C4A+GK literal 0 HcmV?d00001 diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/linux-core/altmain.out b/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/linux-core/altmain.out new file mode 100755 index 0000000000000000000000000000000000000000..2fddf3e8f8037c9c191e401cca604ac695208abf GIT binary patch literal 2330 zcmbtVTWb?R6h5=lHmPZ2+6r2#5~NkDW}8YV#cQZ!!XpDgp z4GsW#JuE9AzXy2Fg)6a1;E;tl#6)gqBZO8~dcH2np_K+mig*Y1)V>OjbXHhO4@+EW z$|X7d*)4SW=0EibnMM3{*k~EEC+6Yjhw`y4556tFKDWF4@zlhT^u3p#=I8Eyo_ja_ zV-(kpdYPzm_otWN!r1vYxteP@t{8)GcKr;ndV&r0M52#yjT;f8_G)EiWfLVFiYM-9 zQ@vehF#+A#si{55?enH*yIwM*PwJV}ZcljQH^wu1I-`$|`Z(;ubd81pA~v={3@ec4 z?mD`Dd7_NAf{kN0i%soekf`mY3>FTt=N9681{fzpdt4GDvW~05TY%2!CA7LOV;5mv zhf#G#$pO~KM&bi89v_PLvHnP6J+gInaFECM#P-Iv4HB5$@bvH?8^8%Nz@vm89nd!5 zSEDP^e7AEg#4v)>Yz0!0Ve}8+&^Qf!wkFOFW543PxCC)%vGNRzCAVUfZ9Pxl1JJFh z)eRiGb<5KTyHIYfCih(iZ#^+0h z17oFX#Tr{OOv5dWEtPGrp2}Apte9TAR&fmzwd?r0q%6DYT6)p;bki#@6;kB_=&n_F zL3gSJ!!nAtFxmp(r4wtc_sv;qI@iG<2l@@P3jcE(n`2zu^k$4a{--LV{>YeCEJVC#?!~$9k*^K6D_(&VP^GetProcessInfo (m_process->GetID (), process_info)) + if (!m_process->GetProcessInfo(process_info)) { if (log) log->Printf ("DynamicLoaderPOSIXDYLD::%s - failed to get process info for pid %" PRIu64, diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp index fb54153..d2ca541 100644 --- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -637,3 +637,18 @@ ProcessElfCore::GetAuxvData() lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(start, len)); return buffer; } + +bool +ProcessElfCore::GetProcessInfo(ProcessInstanceInfo &info) +{ + info.Clear(); + info.SetProcessID(GetID()); + info.SetArchitecture(GetArchitecture()); + lldb::ModuleSP module_sp = GetTarget().GetExecutableModule(); + if (module_sp) + { + const bool add_exe_file_as_first_arg = false; + info.SetExecutableFile(GetTarget().GetExecutableModule()->GetFileSpec(), add_exe_file_as_first_arg); + } + return true; +} diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h index 48220f4..54196d8 100644 --- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h +++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h @@ -111,6 +111,9 @@ public: const lldb::DataBufferSP GetAuxvData() override; + bool + GetProcessInfo(lldb_private::ProcessInstanceInfo &info) override; + protected: void Clear ( ); diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 4f15d58..be21df5 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -3422,7 +3422,7 @@ Process::CompleteAttach () else if (!process_arch.IsValid()) { ProcessInstanceInfo process_info; - platform_sp->GetProcessInfo (GetID(), process_info); + GetProcessInfo(process_info); const ArchSpec &process_arch = process_info.GetArchitecture(); if (process_arch.IsValid() && !GetTarget().GetArchitecture().IsExactMatch(process_arch)) { @@ -6481,6 +6481,18 @@ Process::PrintWarningOptimization (const SymbolContext &sc) } } +bool +Process::GetProcessInfo(ProcessInstanceInfo &info) +{ + info.Clear(); + + PlatformSP platform_sp = GetTarget().GetPlatform(); + if (! platform_sp) + return false; + + return platform_sp->GetProcessInfo(GetID(), info); +} + ThreadCollectionSP Process::GetHistoryThreads(lldb::addr_t addr) { -- 2.7.4