[Lldb-commits] [PATCH] D78421: Fix out of sync source code/executable when debugging

Martin Schmidt via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Sat Apr 18 03:46:05 PDT 2020


n1tram1 updated this revision to Diff 258509.
n1tram1 added a comment.

Apply clang-format


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D78421/new/

https://reviews.llvm.org/D78421

Files:
  lldb/include/lldb/Core/SourceManager.h
  lldb/source/Core/SourceManager.cpp


Index: lldb/source/Core/SourceManager.cpp
===================================================================
--- lldb/source/Core/SourceManager.cpp
+++ lldb/source/Core/SourceManager.cpp
@@ -531,12 +531,47 @@
   // For now we check each time we want to display info for the file.
   auto curr_mod_time = FileSystem::Instance().GetModificationTime(m_file_spec);
 
+  if (IsNewerThanDebuggedExecutable(curr_mod_time))
+    return;
+
   if (curr_mod_time != llvm::sys::TimePoint<>() &&
       m_mod_time != curr_mod_time) {
-    m_mod_time = curr_mod_time;
-    m_data_sp = FileSystem::Instance().CreateDataBuffer(m_file_spec);
-    m_offsets.clear();
+    Update(curr_mod_time);
+  }
+}
+
+bool SourceManager::File::IsNewerThanDebuggedExecutable(llvm::sys::TimePoint<> time)
+{
+  // Check if we are running in a debugger.
+  DebuggerSP debugger_sp(m_debugger_wp.lock());
+  if (debugger_sp) {
+    lldb::TargetSP target_sp(debugger_sp->GetSelectedTarget());
+    if (target_sp) {
+      lldb::ModuleSP exec_module_sp(target_sp->GetExecutableModule());
+      if (exec_module_sp) {
+        auto exec_module_mod_time = exec_module_sp->GetModificationTime();
+
+        // If the source file is newer than the executable don't update,
+	// otherwise the source file being displayed will be different from
+	// the executable being ran.
+	// (We only want to update if the executable has been recompiled)
+        if (time > exec_module_mod_time) {
+	  // TODO: maybe issue a:
+	  //       'warning: Source file is more recent than executable.' ?
+          return true;
+	}
+      }
+    }
   }
+
+  return false;
+}
+
+void SourceManager::File::Update(llvm::sys::TimePoint<> modification_time)
+{
+  m_data_sp = FileSystem::Instance().CreateDataBuffer(m_file_spec);
+  m_offsets.clear();
+  m_mod_time = modification_time;
 }
 
 size_t SourceManager::File::DisplaySourceLines(uint32_t line,
Index: lldb/include/lldb/Core/SourceManager.h
===================================================================
--- lldb/include/lldb/Core/SourceManager.h
+++ lldb/include/lldb/Core/SourceManager.h
@@ -86,6 +86,9 @@
 
   private:
     void CommonInitializer(const FileSpec &file_spec, Target *target);
+
+    bool IsNewerThanDebuggedExecutable(llvm::sys::TimePoint<> time);
+    void Update(llvm::sys::TimePoint<> mod_time);
   };
 
   typedef std::shared_ptr<File> FileSP;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D78421.258509.patch
Type: text/x-patch
Size: 2366 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20200418/b21d15b3/attachment-0001.bin>


More information about the lldb-commits mailing list