[Lldb-commits] [PATCH] D70847: [lldb] Set executable module when adding modules to the Target

Anton Kolesov via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Fri Dec 6 02:57:20 PST 2019


anton.kolesov updated this revision to Diff 232512.
anton.kolesov retitled this revision from "[lldb-vscode] Ensure that target matches the executable file" to "[lldb] Set executable module when adding modules to the Target".
anton.kolesov edited the summary of this revision.
anton.kolesov added a comment.

Reimplement the solution based on a comment from Greg.

Tested with testsuite on Linux for x64 - there are no changes in test results. Also manually tested with a proprietary process plugin - currently it is not possible to run existing testsuite with that plugin because it targets embedded systems which has no `cwd`, `exit()` or environment.

I also attemted to test this against Windows hosts and targets. The change, apparently, resolves that launch capability on Windows, however setting of breakpoints doesn't work - it is only possible to stop application on entry, and on resume it will run till the end. Among the existing lldb-vscode tests some of them depend on <unistd.h> unavailable on windows, others fail because of the breakpoints that don't work.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D70847

Files:
  lldb/source/Target/Target.cpp


Index: lldb/source/Target/Target.cpp
===================================================================
--- lldb/source/Target/Target.cpp
+++ lldb/source/Target/Target.cpp
@@ -2016,12 +2016,15 @@
     // there wasn't an equivalent module in the list already, and if there was,
     // let's remove it.
     if (module_sp) {
+      bool isExecutable = false;
       ObjectFile *objfile = module_sp->GetObjectFile();
       if (objfile) {
         switch (objfile->GetType()) {
+        case ObjectFile::eTypeExecutable: /// A normal executable
+          isExecutable = true;
+          LLVM_FALLTHROUGH;
         case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of
                                         /// a program's execution state
-        case ObjectFile::eTypeExecutable:    /// A normal executable
         case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker
                                              /// executable
         case ObjectFile::eTypeObjectFile:    /// An intermediate object file
@@ -2084,6 +2087,16 @@
         } else {
           m_images.Append(module_sp, notify);
         }
+
+        // Ensure that architecture of the Target matches that of the
+        // executable file. Otherwise Target might use a "default" platform
+        // that can't actually debug the executable. For example, if the Target
+        // is created and by default assumes that it should use "gdb-remote"
+        // process, however executable has an architecture that requires a
+        // different Process class - without explicitly set executable module
+        // Target would attempt to use "gdb-remote" created initially.
+        if (isExecutable)
+          SetExecutableModule(module_sp, eLoadDependentsNo);
       } else
         module_sp.reset();
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D70847.232512.patch
Type: text/x-patch
Size: 1822 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20191206/9090a58f/attachment-0001.bin>


More information about the lldb-commits mailing list