[Lldb-commits] [lldb] [lldb] Fix error when running "memory region --all" repeatedly (PR #177176)
David Spickett via lldb-commits
lldb-commits at lists.llvm.org
Wed Jan 21 06:25:18 PST 2026
https://github.com/DavidSpickett created https://github.com/llvm/llvm-project/pull/177176
Due to some faulty logic, if you ran "memory region --all" twice, the second time lldb would try to repeat the command. There's nothing to repeat, so it failed with an error.
I've fixed the logic so that we treat each --all use as its own command starting from scratch.
For reasons unknown, I could not reproduce this issue using the API test TestMemoryRegion.py. So I have added a shell test that I confirmed does fail without this fix.
>From 04eb9b855e41962e33887f11b85e20bd24e160cb Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Wed, 21 Jan 2026 14:09:57 +0000
Subject: [PATCH] [lldb] Fix error when running "memory region --all"
repeatedly
Due to some faulty logic, if you ran "memory region --all" twice,
the second time lldb would try to repeat the command. There's nothing
to repeat, so it failed with an error.
I've fixed the logic so that we treat each --all use as its own
command starting from scratch.
For reasons unknown, I could not reproduce this issue using the
API test TestMemoryRegion.py. So I have added a shell test that
I confirmed does fail without this fix.
---
lldb/source/Commands/CommandObjectMemory.cpp | 21 ++++++++++---------
.../Shell/Commands/command-memory-region.test | 10 +++++++++
2 files changed, 21 insertions(+), 10 deletions(-)
create mode 100644 lldb/test/Shell/Commands/command-memory-region.test
diff --git a/lldb/source/Commands/CommandObjectMemory.cpp b/lldb/source/Commands/CommandObjectMemory.cpp
index 5786e757ef7ea..cbfd7180f99f6 100644
--- a/lldb/source/Commands/CommandObjectMemory.cpp
+++ b/lldb/source/Commands/CommandObjectMemory.cpp
@@ -1752,16 +1752,17 @@ class CommandObjectMemoryRegion : public CommandObjectParsed {
return;
}
} else if (argc > 1 ||
- // When we're repeating the command, the previous end address is
- // used for load_addr. If that was 0xF...F then we must have
- // reached the end of memory.
- (argc == 0 && !m_memory_region_options.m_all &&
- load_addr == LLDB_INVALID_ADDRESS) ||
- // If the target has non-address bits (tags, limited virtual
- // address size, etc.), the end of mappable memory will be lower
- // than that. So if we find any non-address bit set, we must be
- // at the end of the mappable range.
- (abi && (abi->FixAnyAddress(load_addr) != load_addr))) {
+ (!m_memory_region_options.m_all &&
+ (
+ // When we're repeating the command, the previous end
+ // address is used for load_addr. If that was 0xF...F then
+ // we must have reached the end of memory.
+ (argc == 0 && load_addr == LLDB_INVALID_ADDRESS) ||
+ // If the target has non-address bits (tags, limited virtual
+ // address size, etc.), the end of mappable memory will be
+ // lower than that. So if we find any non-address bit set,
+ // we must be at the end of the mappable range.
+ (abi && (abi->FixAnyAddress(load_addr) != load_addr))))) {
result.AppendErrorWithFormat(
"'%s' takes one argument or \"--all\" option:\nUsage: %s\n",
m_cmd_name.c_str(), m_cmd_syntax.c_str());
diff --git a/lldb/test/Shell/Commands/command-memory-region.test b/lldb/test/Shell/Commands/command-memory-region.test
new file mode 100644
index 0000000000000..35fb7b08cb666
--- /dev/null
+++ b/lldb/test/Shell/Commands/command-memory-region.test
@@ -0,0 +1,10 @@
+## --all should be able to be used many times in a row. As it is not
+## repeatable and starts fresh each time.
+
+# RUN: %clang_host -g -O0 %S/Inputs/main.c -o %t.out
+# RUN: %lldb %t.out -b -o 'b main' -o 'run' -o 'memory region --all' \
+# RUN: -o 'memory region --all' | FileCheck %s
+# CHECK-LABEL: memory region --all
+# CHECK-NEXT: [0x{{[0-9a-f]+}}-0x{{[0-9a-f]+}})
+# CHECK-LABEL: memory region --all
+# CHECK-NEXT: [0x{{[0-9a-f]+}}-0x{{[0-9a-f]+}})
More information about the lldb-commits
mailing list