[Lldb-commits] [lldb] fd89299 - [lldb] Fix crash when completing register names after program exit

David Spickett via lldb-commits lldb-commits at lists.llvm.org
Thu Jul 6 01:35:16 PDT 2023


Author: David Spickett
Date: 2023-07-06T08:35:04Z
New Revision: fd8929904d8820629bae940bce5141ef65bcaa11

URL: https://github.com/llvm/llvm-project/commit/fd8929904d8820629bae940bce5141ef65bcaa11
DIFF: https://github.com/llvm/llvm-project/commit/fd8929904d8820629bae940bce5141ef65bcaa11.diff

LOG: [lldb] Fix crash when completing register names after program exit

Previously the following would crash:
(lldb) run
Process 2594053 launched: '/tmp/test.o' (aarch64)
Process 2594053 exited with status = 0 (0x00000000)
(lldb) register read <tab>

As the completer assumed that the execution context would always
have a register context. After a program has finished, it does not.

Split out the generic parts of the test from the x86 specific tests,
and added "register info" to both.

Reviewed By: JDevlieghere

Differential Revision: https://reviews.llvm.org/D154413

Added: 
    

Modified: 
    lldb/source/Commands/CommandCompletions.cpp
    lldb/test/API/functionalities/completion/TestCompletion.py

Removed: 
    


################################################################################
diff  --git a/lldb/source/Commands/CommandCompletions.cpp b/lldb/source/Commands/CommandCompletions.cpp
index dad63b6aaa1744..21ffba5fa1f3d8 100644
--- a/lldb/source/Commands/CommandCompletions.cpp
+++ b/lldb/source/Commands/CommandCompletions.cpp
@@ -611,6 +611,9 @@ void CommandCompletions::Registers(CommandInterpreter &interpreter,
 
   RegisterContext *reg_ctx =
       interpreter.GetExecutionContext().GetRegisterContext();
+  if (!reg_ctx)
+    return;
+
   const size_t reg_num = reg_ctx->GetRegisterCount();
   for (size_t reg_idx = 0; reg_idx < reg_num; ++reg_idx) {
     const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg_idx);

diff  --git a/lldb/test/API/functionalities/completion/TestCompletion.py b/lldb/test/API/functionalities/completion/TestCompletion.py
index bc39f18fb225b8..2d83abd7a6573e 100644
--- a/lldb/test/API/functionalities/completion/TestCompletion.py
+++ b/lldb/test/API/functionalities/completion/TestCompletion.py
@@ -736,13 +736,25 @@ def test_completion_type_formatter_delete(self):
         self.runCmd("type synthetic add -x Hoo -l test")
         self.complete_from_to("type synthetic delete ", ["Hoo"])
 
-    @skipIf(archs=no_match(["x86_64"]))
-    def test_register_read_and_write_on_x86(self):
-        """Test the completion of the commands register read and write on x86"""
-
+    def test_register_no_complete(self):
         # The tab completion for "register read/write"  won't work without a running process.
         self.complete_from_to("register read ", "register read ")
         self.complete_from_to("register write ", "register write ")
+        self.complete_from_to("register info ", "register info ")
+
+        self.build()
+        self.runCmd("target create {}".format(self.getBuildArtifact("a.out")))
+        self.runCmd("run")
+
+        # Once a program has finished you have an execution context but no register
+        # context so completion cannot work.
+        self.complete_from_to("register read ", "register read ")
+        self.complete_from_to("register write ", "register write ")
+        self.complete_from_to("register info ", "register info ")
+
+    @skipIf(archs=no_match(["x86_64"]))
+    def test_register_read_and_write_on_x86(self):
+        """Test the completion of the commands register read and write on x86"""
 
         self.build()
         self.main_source_spec = lldb.SBFileSpec("main.cpp")


        


More information about the lldb-commits mailing list