Author: David Spickett Date: 2026-01-26T09:43:04Z New Revision: e1a23f71520972415639d8929d61a49dc26a64c6
URL: https://github.com/llvm/llvm-project/commit/e1a23f71520972415639d8929d61a49dc26a64c6 DIFF: https://github.com/llvm/llvm-project/commit/e1a23f71520972415639d8929d61a49dc26a64c6.diff LOG: [lldb] Fix error when running "memory region --all" repeatedly (#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. It should treat each "--all" use as starting from scratch. The logic here was written in a confusing way, so I've refactored it to first look at how many arguments there are (aka how many address expressions there are) and then validate based on that. 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. Added: lldb/test/Shell/Commands/command-memory-region.test Modified: lldb/source/Commands/CommandObjectMemory.cpp Removed: ################################################################################ diff --git a/lldb/source/Commands/CommandObjectMemory.cpp b/lldb/source/Commands/CommandObjectMemory.cpp index 5786e757ef7ea..eabe2fb4c4483 100644 --- a/lldb/source/Commands/CommandObjectMemory.cpp +++ b/lldb/source/Commands/CommandObjectMemory.cpp @@ -1735,7 +1735,24 @@ class CommandObjectMemoryRegion : public CommandObjectParsed { const size_t argc = command.GetArgumentCount(); const lldb::ABISP &abi = process_sp->GetABI(); - if (argc == 1) { + if (argc == 0) { + if (!m_memory_region_options.m_all) { + if ( // 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. + (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()); + return; + } + } + } else if (argc == 1) { if (m_memory_region_options.m_all) { result.AppendError( "The \"--all\" option cannot be used when an address " @@ -1751,17 +1768,8 @@ class CommandObjectMemoryRegion : public CommandObjectParsed { command[0].c_str(), error.AsCString()); 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))) { + } else { + // argc > 1 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]+}}) _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
