mgorny updated this revision to Diff 309871. mgorny edited the summary of this revision. mgorny added a comment.
Rewritten the test wrt comments, that is: 1. Added a breakpoint-continue to ensure that the program is past all initial work before we test it. 2. Print a global variable to test it. I have also confirmed that reading the variable fails without the code change (because of reading wrong memory address), but also the breakpoint doesn't get set correctly. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D92264/new/ https://reviews.llvm.org/D92264 Files: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.h lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp lldb/test/API/commands/process/attach/TestProcessAttach.py lldb/test/API/commands/process/attach/main.cpp
Index: lldb/test/API/commands/process/attach/main.cpp =================================================================== --- lldb/test/API/commands/process/attach/main.cpp +++ lldb/test/API/commands/process/attach/main.cpp @@ -3,6 +3,8 @@ #include <chrono> #include <thread> +volatile int g_val = 12345; + int main(int argc, char const *argv[]) { int temp; lldb_enable_attach(); Index: lldb/test/API/commands/process/attach/TestProcessAttach.py =================================================================== --- lldb/test/API/commands/process/attach/TestProcessAttach.py +++ lldb/test/API/commands/process/attach/TestProcessAttach.py @@ -20,6 +20,13 @@ NO_DEBUG_INFO_TESTCASE = True + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + # Find the line number to break for main.c. + self.line = line_number('main.cpp', + '// Waiting to be attached...') + @skipIfiOSSimulator def test_attach_to_process_by_id(self): """Test attach by process id""" @@ -77,6 +84,28 @@ process = target.GetProcess() self.assertTrue(process, PROCESS_IS_VALID) + def test_attach_to_process_by_id_correct_executable_offset(self): + """ + Test that after attaching to a process the executable offset + is determined correctly on FreeBSD. This is a regression test + for dyld plugin getting the correct executable path, + and therefore being able to identify it in the module list. + """ + + self.build() + exe = self.getBuildArtifact(exe_name) + + # In order to reproduce, we must spawn using a relative path + popen = self.spawnSubprocess(os.path.relpath(exe)) + + self.runCmd("process attach -p " + str(popen.pid)) + + # Make suer we did not attach to early + lldbutil.run_break_set_by_file_and_line( + self, "main.cpp", self.line, num_expected_locations=1, loc_exact=False) + self.runCmd("process continue") + self.expect("p g_val", substrs=["$0 = 12345"]) + def tearDown(self): # Destroy process before TestBase.tearDown() self.dbg.GetSelectedTarget().GetProcess().Destroy() Index: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp =================================================================== --- lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp +++ lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp @@ -101,6 +101,7 @@ ModuleSP executable_sp = GetTargetExecutable(); ResolveExecutableModule(executable_sp); + m_rendezvous.UpdateExecutablePath(); // find the main process load offset addr_t load_offset = ComputeLoadOffset(); Index: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.h =================================================================== --- lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.h +++ lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.h @@ -60,6 +60,9 @@ DYLDRendezvous(lldb_private::Process *process); + /// Update the cached executable path. + void UpdateExecutablePath(); + /// Update the internal snapshot of runtime linker rendezvous and recompute /// the currently loaded modules. /// Index: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp =================================================================== --- lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp +++ lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp @@ -94,12 +94,13 @@ : m_process(process), m_rendezvous_addr(LLDB_INVALID_ADDRESS), m_current(), m_previous(), m_loaded_modules(), m_soentries(), m_added_soentries(), m_removed_soentries() { - Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER)); - m_thread_info.valid = false; + UpdateExecutablePath(); +} - // Cache a copy of the executable path +void DYLDRendezvous::UpdateExecutablePath() { if (m_process) { + Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER)); Module *exe_mod = m_process->GetTarget().GetExecutableModulePointer(); if (exe_mod) { m_exe_file_spec = exe_mod->GetPlatformFileSpec();
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits