From 7d01b85c2a0aa8bc91f731cfeb2a7b6885b8d04a Mon Sep 17 00:00:00 2001 From: David Spickett Date: Fri, 2 May 2025 12:54:03 +0000 Subject: Reland "[lldb] Do not bump memory modificator ID when "internal" debugger memory is updated (#129092)" This reverts commit daa4061d61216456baa83ab404e096200e327fb4. Original PR https://github.com/llvm/llvm-project/pull/129092. I have restricted the test to X86 Windows because it turns out the only reason that `expr x.get()` would change m_memory_id is that on x86 we have to write the return address to the stack in ABIWindows_X86_64::PrepareTrivialCall: ``` // Save return address onto the stack if (!process_sp->WritePointerToMemory(sp, return_addr, error)) return false; ``` This is not required on AArch64 so m_memory_id was not changed: ``` (lldb) expr x.get() (int) $0 = 0 (lldb) process status -d Process 15316 stopped * thread #1, stop reason = Exception 0x80000003 encountered at address 0x7ff764a31034 frame #0: 0x00007ff764a31038 TestProcessModificationIdOnExpr.cpp.tmp`main at TestProcessModificationIdOnExpr.cpp:35 32 __builtin_debugtrap(); 33 __builtin_debugtrap(); 34 return 0; -> 35 } 36 37 // CHECK-LABEL: process status -d 38 // CHECK: m_stop_id: 2 ProcessModID: m_stop_id: 3 m_last_natural_stop_id: 0 m_resume_id: 0 m_memory_id: 0 ``` Really we should find a better way to force a memory write here, but I can't think of one right now. --- lldb/source/Commands/CommandObjectProcess.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'lldb/source/Commands/CommandObjectProcess.cpp') diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp index ed80c854ed66..d0f5eaf2dfd9 100644 --- a/lldb/source/Commands/CommandObjectProcess.cpp +++ b/lldb/source/Commands/CommandObjectProcess.cpp @@ -1388,6 +1388,9 @@ public: case 'v': m_verbose = true; break; + case 'd': + m_dump = true; + break; default: llvm_unreachable("Unimplemented option"); } @@ -1397,6 +1400,7 @@ public: void OptionParsingStarting(ExecutionContext *execution_context) override { m_verbose = false; + m_dump = false; } llvm::ArrayRef GetDefinitions() override { @@ -1405,6 +1409,7 @@ public: // Instance variables to hold the values for command options. bool m_verbose = false; + bool m_dump = false; }; protected: @@ -1459,6 +1464,14 @@ protected: crash_info_sp->GetDescription(strm); } } + + if (m_options.m_dump) { + StateType state = process->GetState(); + if (state == eStateStopped) { + ProcessModID process_mod_id = process->GetModID(); + process_mod_id.Dump(result.GetOutputStream()); + } + } } private: -- cgit v1.2.3