Skip to content

Conversation

@DavidSpickett
Copy link
Collaborator

Prior to this the command would simply crash when run on a running process.

Of the three register commands, "info" was the only one missing these requirements. On some level it makes sense because you're not going to read a value or modify anything, but practically I think lldb assumes any time you're going to access register related stuff, the process should be paused.

I noticed this debugging with a remote gdb stub, so I've recreated that scenario using attach in a new test case.

@llvmbot llvmbot added the lldb label Sep 22, 2023
@DavidSpickett DavidSpickett requested a review from a team September 22, 2023 12:32
@llvmbot
Copy link
Member

llvmbot commented Sep 22, 2023

@llvm/pr-subscribers-lldb

Changes

Prior to this the command would simply crash when run on a running process.

Of the three register commands, "info" was the only one missing these requirements. On some level it makes sense because you're not going to read a value or modify anything, but practically I think lldb assumes any time you're going to access register related stuff, the process should be paused.

I noticed this debugging with a remote gdb stub, so I've recreated that scenario using attach in a new test case.


Full diff: https://github.com/llvm/llvm-project/pull/67124.diff

2 Files Affected:

  • (modified) lldb/source/Commands/CommandObjectRegister.cpp (+3-2)
  • (modified) lldb/test/API/commands/register/register/register_command/TestRegisters.py (+13)
diff --git a/lldb/source/Commands/CommandObjectRegister.cpp b/lldb/source/Commands/CommandObjectRegister.cpp
index a0e88f6ab4ba27d..6e6071fd54606d0 100644
--- a/lldb/source/Commands/CommandObjectRegister.cpp
+++ b/lldb/source/Commands/CommandObjectRegister.cpp
@@ -406,8 +406,9 @@ class CommandObjectRegisterInfo : public CommandObjectParsed {
   CommandObjectRegisterInfo(CommandInterpreter &interpreter)
       : CommandObjectParsed(interpreter, "register info",
                             "View information about a register.", nullptr,
-                            eCommandRequiresRegContext |
-                                eCommandProcessMustBeLaunched) {
+                            eCommandRequiresFrame | eCommandRequiresRegContext |
+                                eCommandProcessMustBeLaunched |
+                                eCommandProcessMustBePaused) {
     SetHelpLong(R"(
 Name             The name lldb uses for the register, optionally with an alias.
 Size             The size of the register in bytes and again in bits.
diff --git a/lldb/test/API/commands/register/register/register_command/TestRegisters.py b/lldb/test/API/commands/register/register/register_command/TestRegisters.py
index 2e5c82a26cf1b9d..0ad9b8b24b3585c 100644
--- a/lldb/test/API/commands/register/register/register_command/TestRegisters.py
+++ b/lldb/test/API/commands/register/register/register_command/TestRegisters.py
@@ -659,3 +659,16 @@ def test_fs_gs_base(self):
             pthread_self_val.GetValueAsUnsigned(0),
             "fs_base does not equal to pthread_self() value.",
         )
+
+    def test_process_must_be_stopped(self):
+        """Check that all register commands error when the process is not stopped."""
+        self.build()
+        exe = self.getBuildArtifact("a.out")
+        pid = self.spawnSubprocess(exe, ["wait_for_attach"]).pid
+        self.setAsync(True)
+        self.runCmd("process attach --continue -p %d" % pid)
+
+        err_msg = "Command requires a process which is currently stopped."
+        self.expect("register read pc", substrs=[err_msg], error=True)
+        self.expect("register write pc 0", substrs=[err_msg], error=True)
+        self.expect("register info pc", substrs=[err_msg], error=True)

Prior to this the command would simply crash when run on a running
process.

Of the three register commands, "info" was the only one missing these
requirements. On some level it makes sense because you're not going
to read a value or modify anything, but practically I think lldb
assumes any time you're going to access register related stuff,
the process should be paused.

I noticed this debugging with a remote gdb stub, so I've recreated
that scenario using attach in a new test case.
@DavidSpickett DavidSpickett merged commit bb01fd5 into llvm:main Sep 22, 2023
@DavidSpickett DavidSpickett deleted the lldb-reg-info branch September 22, 2023 14:55
@jimingham
Copy link
Collaborator

jimingham commented Sep 22, 2023 via email

@DavidSpickett
Copy link
Collaborator Author

Thanks for the explanation. Now I understand what I'm seeing is the expected behaviour, and async mode is the expected way to achieve what the test needs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants