https://github.com/jimingham updated 
https://github.com/llvm/llvm-project/pull/137410

>From 8a5e25a6e850222fcbb94f685d46895d2666041f Mon Sep 17 00:00:00 2001
From: Jim Ingham <jing...@apple.com>
Date: Fri, 25 Apr 2025 15:35:12 -0700
Subject: [PATCH 1/2] Make stop-hooks fire when lldb first gains control of a
 process.

---
 lldb/include/lldb/Target/Target.h             |   11 +-
 lldb/source/Commands/CommandObjectTarget.cpp  |   16 +
 lldb/source/Commands/Options.td               |    7 +-
 lldb/source/Target/Process.cpp                |    6 +
 lldb/source/Target/Target.cpp                 |   37 +-
 .../target/stop-hooks/TestStopHookScripted.py |    6 +-
 .../target/stop-hooks/TestStopHooks.py        |    3 +-
 .../on-core-load/TestStopHookOnCoreLoad.py    |   55 +
 .../stop-hooks/on-core-load/linux-x86_64.core |  Bin 0 -> 32768 bytes
 .../stop-hooks/on-core-load/stop_hook.py      |   28 +
 .../stop-hooks/on-core-load/test.core.yaml    | 1056 +++++++++++++++++
 lldb/test/API/python_api/event/TestEvents.py  |    3 +-
 12 files changed, 1218 insertions(+), 10 deletions(-)
 create mode 100644 
lldb/test/API/commands/target/stop-hooks/on-core-load/TestStopHookOnCoreLoad.py
 create mode 100644 
lldb/test/API/commands/target/stop-hooks/on-core-load/linux-x86_64.core
 create mode 100644 
lldb/test/API/commands/target/stop-hooks/on-core-load/stop_hook.py
 create mode 100644 
lldb/test/API/commands/target/stop-hooks/on-core-load/test.core.yaml

diff --git a/lldb/include/lldb/Target/Target.h 
b/lldb/include/lldb/Target/Target.h
index 29183cc267721..7aa1fd18233c2 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -1369,6 +1369,12 @@ class Target : public 
std::enable_shared_from_this<Target>,
     }
 
     bool GetAutoContinue() const { return m_auto_continue; }
+    
+    void SetRunAtFirstStop(bool at_first_stop) {
+      m_at_first_stop = at_first_stop;
+    }
+    
+    bool GetRunAtFirstStop() const { return m_at_first_stop; }
 
     void GetDescription(Stream &s, lldb::DescriptionLevel level) const;
     virtual void GetSubclassDescription(Stream &s,
@@ -1380,6 +1386,7 @@ class Target : public 
std::enable_shared_from_this<Target>,
     std::unique_ptr<ThreadSpec> m_thread_spec_up;
     bool m_active = true;
     bool m_auto_continue = false;
+    bool m_at_first_stop = true;
 
     StopHook(lldb::TargetSP target_sp, lldb::user_id_t uid);
   };
@@ -1446,7 +1453,9 @@ class Target : public 
std::enable_shared_from_this<Target>,
 
   // Runs the stop hooks that have been registered for this target.
   // Returns true if the stop hooks cause the target to resume.
-  bool RunStopHooks();
+  // Pass at_initial_stop if this is the stop where lldb gains
+  // control over the process for the first time.
+  bool RunStopHooks(bool at_initial_stop = false);
 
   size_t GetStopHookSize();
 
diff --git a/lldb/source/Commands/CommandObjectTarget.cpp 
b/lldb/source/Commands/CommandObjectTarget.cpp
index 3f7d3007ed168..3f73157155a02 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -4795,6 +4795,17 @@ class CommandObjectTargetStopHookAdd : public 
CommandObjectParsed,
         m_use_one_liner = true;
         m_one_liner.push_back(std::string(option_arg));
         break;
+        
+      case 'F': {
+        bool value, success;
+        value = OptionArgParser::ToBoolean(option_arg, false, &success);
+        if (success) {
+          m_at_first_stop = value;
+        } else
+          error = Status::FromErrorStringWithFormat(
+              "invalid boolean value '%s' passed for -F option",
+              option_arg.str().c_str());
+      } break;
 
       default:
         llvm_unreachable("Unimplemented option");
@@ -4822,6 +4833,7 @@ class CommandObjectTargetStopHookAdd : public 
CommandObjectParsed,
       m_use_one_liner = false;
       m_one_liner.clear();
       m_auto_continue = false;
+      m_at_first_stop = true;
     }
 
     std::string m_class_name;
@@ -4842,6 +4854,7 @@ class CommandObjectTargetStopHookAdd : public 
CommandObjectParsed,
     // Instance variables to hold the values for one_liner options.
     bool m_use_one_liner = false;
     std::vector<std::string> m_one_liner;
+    bool m_at_first_stop;
 
     bool m_auto_continue = false;
   };
@@ -5006,6 +5019,9 @@ Filter Options:
 
     if (specifier_up)
       new_hook_sp->SetSpecifier(specifier_up.release());
+      
+    // Should we run at first stop:
+    new_hook_sp->SetRunAtFirstStop(m_options.m_at_first_stop);
 
     // Next see if any of the thread options have been entered:
 
diff --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td
index 53864ff29327d..50313ac2cacbc 100644
--- a/lldb/source/Commands/Options.td
+++ b/lldb/source/Commands/Options.td
@@ -1050,8 +1050,13 @@ let Command = "target stop hook add" in {
     Arg<"FunctionName">, Desc<"Set the function name within which the stop 
hook"
     " will be run.">, Completion<"Symbol">;
   def target_stop_hook_add_auto_continue : Option<"auto-continue", "G">,
-    Arg<"Boolean">, Desc<"The breakpoint will auto-continue after running its"
+    Arg<"Boolean">, Desc<"The stop-hook will auto-continue after running its"
     " commands.">;
+  def target_stop_hook_add_at_first_stop : Option<"at-first-stop", "F">,
+    Arg<"Boolean">, Desc<"Whether the stop-hook will trigger when lldb first "
+    "gains control of the process.  For a process launch, this first stop "
+    "may happen very early on - before the loader has run.  You might not want 
"
+    "some stop-hooks to run then.  Defaults to true.">;
 }
 
 let Command = "thread backtrace" in {
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 73557eb767c72..f68bfa504f2c0 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -2830,6 +2830,9 @@ Status Process::LoadCore() {
           "Did not get stopped event after loading the core file.");
     }
     RestoreProcessEvents();
+    // Since we hijacked the event stream, we will have we won't have run the
+    // stop hooks.  Make sure we do that here:
+    GetTarget().RunStopHooks(true /* at_initial_stop */);
   }
   return error;
 }
@@ -3200,6 +3203,9 @@ void Process::CompleteAttach() {
                         : "<none>");
     }
   }
+  // Since we hijacked the event stream, we will have we won't have run the
+  // stop hooks.  Make sure we do that here:
+  GetTarget().RunStopHooks(true /* at_initial_stop */);
 }
 
 Status Process::ConnectRemote(llvm::StringRef remote_url) {
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 0fa61b20e19b9..3b31f6d0406a5 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -3038,7 +3038,7 @@ void Target::SetAllStopHooksActiveState(bool 
active_state) {
   }
 }
 
-bool Target::RunStopHooks() {
+bool Target::RunStopHooks(bool at_initial_stop) {
   if (m_suppress_stop_hooks)
     return false;
 
@@ -3047,14 +3047,18 @@ bool Target::RunStopHooks() {
 
   // Somebody might have restarted the process:
   // Still return false, the return value is about US restarting the target.
-  if (m_process_sp->GetState() != eStateStopped)
+  lldb::StateType state = m_process_sp->GetState();
+  if (!(state == eStateStopped || state == eStateAttaching))
     return false;
 
   if (m_stop_hooks.empty())
     return false;
 
   bool no_active_hooks =
-      llvm::none_of(m_stop_hooks, [](auto &p) { return p.second->IsActive(); 
});
+      llvm::none_of(m_stop_hooks, [at_initial_stop](auto &p) {
+      bool should_run_now = !at_initial_stop || p.second->GetRunAtFirstStop();
+      return p.second->IsActive() && should_run_now; 
+  });
   if (no_active_hooks)
     return false;
 
@@ -3084,9 +3088,22 @@ bool Target::RunStopHooks() {
   }
 
   // If no threads stopped for a reason, don't run the stop-hooks.
+  // However, if this is the FIRST stop for this process, then we are in the
+  // state where an attach or a core file load was completed without 
designating
+  // a particular thread as responsible for the stop.  In that case, we do
+  // want to run the stop hooks, but do so just on one thread.
   size_t num_exe_ctx = exc_ctx_with_reasons.size();
-  if (num_exe_ctx == 0)
-    return false;
+  if (num_exe_ctx == 0) {
+    if (at_initial_stop && num_threads > 0) {
+      lldb::ThreadSP thread_to_use_sp = cur_threadlist.GetThreadAtIndex(0);
+      exc_ctx_with_reasons.emplace_back(m_process_sp.get(),
+                                        thread_to_use_sp.get(),
+                                        
thread_to_use_sp->GetStackFrameAtIndex(0).get());
+      num_exe_ctx = 1;
+    } else
+      return false;
+  }
+  
 
   StreamSP output_sp = m_debugger.GetAsyncOutputStream();
   auto on_exit = llvm::make_scope_exit([output_sp] { output_sp->Flush(); });
@@ -3100,6 +3117,8 @@ bool Target::RunStopHooks() {
     StopHookSP cur_hook_sp = stop_entry.second;
     if (!cur_hook_sp->IsActive())
       continue;
+    if (at_initial_stop && !cur_hook_sp->GetRunAtFirstStop())
+      continue;
 
     bool any_thread_matched = false;
     for (auto exc_ctx : exc_ctx_with_reasons) {
@@ -3426,10 +3445,14 @@ Status Target::Launch(ProcessLaunchInfo &launch_info, 
Stream *stream) {
   m_process_sp->RestoreProcessEvents();
 
   if (rebroadcast_first_stop) {
+    // We don't need to run the stop hooks by hand here, they will get
+    // triggered when this rebroadcast event gets fetched.
     assert(first_stop_event_sp);
     m_process_sp->BroadcastEvent(first_stop_event_sp);
     return error;
   }
+  // Run the stop hooks that want to run at entry.
+  RunStopHooks(true /* at entry point */);
 
   switch (state) {
   case eStateStopped: {
@@ -3581,6 +3604,10 @@ Status Target::Attach(ProcessAttachInfo &attach_info, 
Stream *stream) {
           std::nullopt, nullptr, false, attach_info.GetHijackListener(), 
stream,
           true, SelectMostRelevantFrame);
       process_sp->RestoreProcessEvents();
+      
+      // Run the stop hooks here.  Since we were hijacking the events, they 
+      // wouldn't have gotten run as part of event delivery.
+      RunStopHooks(true /* at_initial_stop */);
 
       if (state != eStateStopped) {
         const char *exit_desc = process_sp->GetExitDescription();
diff --git a/lldb/test/API/commands/target/stop-hooks/TestStopHookScripted.py 
b/lldb/test/API/commands/target/stop-hooks/TestStopHookScripted.py
index 7c10669442b1c..38d8815e8ff50 100644
--- a/lldb/test/API/commands/target/stop-hooks/TestStopHookScripted.py
+++ b/lldb/test/API/commands/target/stop-hooks/TestStopHookScripted.py
@@ -50,7 +50,11 @@ def test_bad_handler(self):
 
     def test_stop_hooks_scripted(self):
         """Test that a scripted stop hook works with no specifiers"""
-        self.stop_hooks_scripted(5)
+        self.stop_hooks_scripted(5, "-F false")
+
+    def test_stop_hooks_scripted_no_entry(self):
+        """Test that a scripted stop hook works with no specifiers"""
+        self.stop_hooks_scripted(10)
 
     def test_stop_hooks_scripted_right_func(self):
         """Test that a scripted stop hook fires when there is a function 
match"""
diff --git a/lldb/test/API/commands/target/stop-hooks/TestStopHooks.py 
b/lldb/test/API/commands/target/stop-hooks/TestStopHooks.py
index 7d52676121827..2d13b06d09c1a 100644
--- a/lldb/test/API/commands/target/stop-hooks/TestStopHooks.py
+++ b/lldb/test/API/commands/target/stop-hooks/TestStopHooks.py
@@ -55,7 +55,7 @@ def step_out_test(self):
     def after_expr_test(self):
         interp = self.dbg.GetCommandInterpreter()
         result = lldb.SBCommandReturnObject()
-        interp.HandleCommand("target stop-hook add -o 'expr g_var++'", result)
+        interp.HandleCommand("target stop-hook add -o 'expr g_var++' -F 
false", result)
         self.assertTrue(result.Succeeded(), "Set the target stop hook")
 
         (target, process, thread, first_bkpt) = 
lldbutil.run_to_source_breakpoint(
@@ -109,3 +109,4 @@ def before_and_after_target(self):
         self.expect(
             "target stop-hook list", substrs=["expr g_var++", "thread 
backtrace"]
         )
+        
diff --git 
a/lldb/test/API/commands/target/stop-hooks/on-core-load/TestStopHookOnCoreLoad.py
 
b/lldb/test/API/commands/target/stop-hooks/on-core-load/TestStopHookOnCoreLoad.py
new file mode 100644
index 0000000000000..364a85fdd84ae
--- /dev/null
+++ 
b/lldb/test/API/commands/target/stop-hooks/on-core-load/TestStopHookOnCoreLoad.py
@@ -0,0 +1,55 @@
+"""
+Test that stop hooks fire on core load (first stop)
+"""
+
+
+import lldb
+import os
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestStopOnCoreLoad(TestBase):
+    NO_DEBUG_INFO_TESTCASE = True
+
+    # This was originally marked as expected failure on Windows, but it has
+    # started timing out instead, so the expectedFailure attribute no longer
+    # correctly tracks it: llvm.org/pr37371
+    @skipIfWindows
+    def test_hook_runs_no_threads(self):
+        # Create core form YAML.
+        core_path = self.getBuildArtifact("test.core")
+        self.yaml2obj("test.core.yaml", core_path)
+
+       # Since mach core files don't have stop reasons, we should choose
+       # the first thread:
+        self.do_test(core_path, 1)
+
+    def test_hook_one_thread(self):
+        core_path = os.path.join(self.getSourceDir(), "linux-x86_64.core")
+        self.do_test(core_path, 3)
+
+        
+    def do_test(self, core_path, stop_thread):
+        # Set debugger into synchronous mode
+        self.dbg.SetAsync(False)
+
+        # Create a target by the debugger.
+        target = self.dbg.CreateTarget("")
+
+        # load the stop hook module and add the stop hook:
+        stop_hook_path = os.path.join(self.getSourceDir(), "stop_hook.py")
+        self.runCmd(f"command script import {stop_hook_path}")
+        self.runCmd("target stop-hook add -P stop_hook.stop_handler")
+        
+        # Load core.
+        process = target.LoadCore(core_path)
+        self.assertTrue(process, PROCESS_IS_VALID)
+       # Now run our report command and make sure we get the right answer.
+        
+        result = lldb.SBCommandReturnObject()
+        self.dbg.GetCommandInterpreter().HandleCommand("report_command", 
result)
+        print(f"Command Output: '{result.GetOutput}'")
+        self.assertIn(f"Stop Threads: {stop_thread}", result.GetOutput(), "Ran 
the stop hook")
+        
diff --git 
a/lldb/test/API/commands/target/stop-hooks/on-core-load/linux-x86_64.core 
b/lldb/test/API/commands/target/stop-hooks/on-core-load/linux-x86_64.core
new file mode 100644
index 
0000000000000000000000000000000000000000..fc27e5810ee589fc810bdda01d6c227c734f34a3
GIT binary patch
literal 32768
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
IUm*nk2i#1bF8}}l

literal 0
HcmV?d00001

diff --git a/lldb/test/API/commands/target/stop-hooks/on-core-load/stop_hook.py 
b/lldb/test/API/commands/target/stop-hooks/on-core-load/stop_hook.py
new file mode 100644
index 0000000000000..ba8215e69dc42
--- /dev/null
+++ b/lldb/test/API/commands/target/stop-hooks/on-core-load/stop_hook.py
@@ -0,0 +1,28 @@
+import lldb
+
+def report_command(debugger, command, exe_ctx, result, internal_dict):
+    global stop_thread
+    print(f"About to report out stop_thread: {stop_thread}")
+    mssg = f"Stop Threads: {stop_thread}"
+    result.AppendMessage(mssg)
+
+    result.SetStatus(lldb.eReturnStatusSuccessFinishResult)
+    
+class stop_handler:
+    def __init__(self, target, extra_args, dict):
+        global stop_thread
+        stop_thead = 0
+        self.target = target
+
+    def handle_stop(self, exe_ctx, stream):
+        global stop_thread
+        thread = exe_ctx.thread
+        stop_thread = thread.idx
+
+def __lldb_init_module(debugger, internal_dict):
+    global stop_thread
+    stop_thread = 0
+    debugger.HandleCommand(
+           f"command script add -o -f '{__name__}.report_command' 
report_command"
+)
+
diff --git 
a/lldb/test/API/commands/target/stop-hooks/on-core-load/test.core.yaml 
b/lldb/test/API/commands/target/stop-hooks/on-core-load/test.core.yaml
new file mode 100644
index 0000000000000..009c44aa1d1ad
--- /dev/null
+++ b/lldb/test/API/commands/target/stop-hooks/on-core-load/test.core.yaml
@@ -0,0 +1,1056 @@
+--- !mach-o
+FileHeader:      
+  magic:           0xFEEDFACF
+  cputype:         0x01000007
+  cpusubtype:      0x00000003
+  filetype:        0x00000004
+  ncmds:           59
+  sizeofcmds:      4384
+  flags:           0x00000000
+  reserved:        0x00000000
+LoadCommands:    
+  - cmd:             LC_THREAD
+    cmdsize:         208
+    PayloadBytes:    
+      - 0x04
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x2A
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x01
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x80
+      - 0xF7
+      - 0xBF
+      - 0xEF
+      - 0xFE
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0x20
+      - 0xF6
+      - 0xBF
+      - 0xEF
+      - 0xFE
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0x01
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x10
+      - 0xF6
+      - 0xBF
+      - 0xEF
+      - 0xFE
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0xF0
+      - 0xF5
+      - 0xBF
+      - 0xEF
+      - 0xFE
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0xF0
+      - 0xF5
+      - 0xBF
+      - 0xEF
+      - 0xFE
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0xFF
+      - 0xFF
+      - 0xFF
+      - 0xFF
+      - 0xC8
+      - 0xB0
+      - 0x70
+      - 0xA7
+      - 0xFF
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0xD0
+      - 0xB0
+      - 0x70
+      - 0xA7
+      - 0xFF
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0xA0
+      - 0x0F
+      - 0x00
+      - 0x00
+      - 0x01
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x46
+      - 0x02
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x2B
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x06
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x04
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x03
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x10
+      - 0x00
+      - 0x02
+      - 0xA7
+      - 0xFF
+      - 0x7F
+      - 0x00
+      - 0x00
+  - cmd:             LC_THREAD
+    cmdsize:         208
+    PayloadBytes:    
+      - 0x04
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x2A
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x01
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x80
+      - 0xF7
+      - 0xBF
+      - 0xEF
+      - 0xFE
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0x20
+      - 0xF6
+      - 0xBF
+      - 0xEF
+      - 0xFE
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0x01
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x10
+      - 0xF6
+      - 0xBF
+      - 0xEF
+      - 0xFE
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0xF0
+      - 0xF5
+      - 0xBF
+      - 0xEF
+      - 0xFE
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0xF0
+      - 0xF5
+      - 0xBF
+      - 0xEF
+      - 0xFE
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0xFF
+      - 0xFF
+      - 0xFF
+      - 0xFF
+      - 0xC8
+      - 0xB0
+      - 0x70
+      - 0xA7
+      - 0xFF
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0xD0
+      - 0xB0
+      - 0x70
+      - 0xA7
+      - 0xFF
+      - 0x7F
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0xA0
+      - 0x0F
+      - 0x00
+      - 0x00
+      - 0x01
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x46
+      - 0x02
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x2B
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x06
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x04
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x03
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x00
+      - 0x10
+      - 0x00
+      - 0x02
+      - 0xA7
+      - 0xFF
+      - 0x7F
+      - 0x00
+      - 0x00
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4294967296
+    vmsize:          4096
+    fileoff:         8192
+    filesize:        4096
+    maxprot:         5
+    initprot:        5
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4294971392
+    vmsize:          4096
+    fileoff:         12288
+    filesize:        4096
+    maxprot:         1
+    initprot:        1
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4294975488
+    vmsize:          307200
+    fileoff:         16384
+    filesize:        307200
+    maxprot:         5
+    initprot:        5
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295282688
+    vmsize:          12288
+    fileoff:         323584
+    filesize:        12288
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295294976
+    vmsize:          217088
+    fileoff:         335872
+    filesize:        217088
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295512064
+    vmsize:          110592
+    fileoff:         552960
+    filesize:        110592
+    maxprot:         1
+    initprot:        1
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295622656
+    vmsize:          8192
+    fileoff:         663552
+    filesize:        8192
+    maxprot:         1
+    initprot:        1
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295630848
+    vmsize:          8192
+    fileoff:         671744
+    filesize:        8192
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295639040
+    vmsize:          4096
+    fileoff:         679936
+    filesize:        4096
+    maxprot:         1
+    initprot:        1
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295643136
+    vmsize:          4096
+    fileoff:         684032
+    filesize:        4096
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295651328
+    vmsize:          24576
+    fileoff:         688128
+    filesize:        24576
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295684096
+    vmsize:          24576
+    fileoff:         712704
+    filesize:        24576
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295712768
+    vmsize:          4096
+    fileoff:         737280
+    filesize:        4096
+    maxprot:         1
+    initprot:        1
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4295716864
+    vmsize:          8192
+    fileoff:         741376
+    filesize:        8192
+    maxprot:         1
+    initprot:        1
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4296015872
+    vmsize:          1048576
+    fileoff:         749568
+    filesize:        1048576
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4297064448
+    vmsize:          1048576
+    fileoff:         1798144
+    filesize:        1048576
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4298113024
+    vmsize:          1048576
+    fileoff:         2846720
+    filesize:        1048576
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          4303355904
+    vmsize:          8388608
+    fileoff:         3895296
+    filesize:        8388608
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140732912369664
+    vmsize:          8388608
+    fileoff:         12283904
+    filesize:        8388608
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140734252867584
+    vmsize:          811999232
+    fileoff:         20672512
+    filesize:        811999232
+    maxprot:         5
+    initprot:        5
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735863480320
+    vmsize:          20553728
+    fileoff:         832671744
+    filesize:        20553728
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735884034048
+    vmsize:          2097152
+    fileoff:         853225472
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735886131200
+    vmsize:          2097152
+    fileoff:         855322624
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735888228352
+    vmsize:          2097152
+    fileoff:         857419776
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735890325504
+    vmsize:          2097152
+    fileoff:         859516928
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735892422656
+    vmsize:          2097152
+    fileoff:         861614080
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735894519808
+    vmsize:          2097152
+    fileoff:         863711232
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735896616960
+    vmsize:          2097152
+    fileoff:         865808384
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735898714112
+    vmsize:          2097152
+    fileoff:         867905536
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735900811264
+    vmsize:          2097152
+    fileoff:         870002688
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735902908416
+    vmsize:          10485760
+    fileoff:         872099840
+    filesize:        10485760
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735913394176
+    vmsize:          4194304
+    fileoff:         882585600
+    filesize:        4194304
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735917588480
+    vmsize:          2097152
+    fileoff:         886779904
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735919685632
+    vmsize:          2097152
+    fileoff:         888877056
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735921782784
+    vmsize:          4194304
+    fileoff:         890974208
+    filesize:        4194304
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735925977088
+    vmsize:          4194304
+    fileoff:         895168512
+    filesize:        4194304
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735930171392
+    vmsize:          6291456
+    fileoff:         899362816
+    filesize:        6291456
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735936462848
+    vmsize:          2097152
+    fileoff:         905654272
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735938560000
+    vmsize:          2097152
+    fileoff:         907751424
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735940657152
+    vmsize:          2097152
+    fileoff:         909848576
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735942754304
+    vmsize:          2097152
+    fileoff:         911945728
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735944851456
+    vmsize:          6291456
+    fileoff:         914042880
+    filesize:        6291456
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735951142912
+    vmsize:          2097152
+    fileoff:         920334336
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735953240064
+    vmsize:          4194304
+    fileoff:         922431488
+    filesize:        4194304
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735957434368
+    vmsize:          2097152
+    fileoff:         926625792
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735959531520
+    vmsize:          2097152
+    fileoff:         928722944
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735961628672
+    vmsize:          20971520
+    fileoff:         930820096
+    filesize:        20971520
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735982600192
+    vmsize:          6291456
+    fileoff:         951791616
+    filesize:        6291456
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735988891648
+    vmsize:          2097152
+    fileoff:         958083072
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735990988800
+    vmsize:          2097152
+    fileoff:         960180224
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735993085952
+    vmsize:          2097152
+    fileoff:         962277376
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735995183104
+    vmsize:          2097152
+    fileoff:         964374528
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735997280256
+    vmsize:          2097152
+    fileoff:         966471680
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140735999377408
+    vmsize:          2097152
+    fileoff:         968568832
+    filesize:        2097152
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140736001474560
+    vmsize:          1302528
+    fileoff:         970665984
+    filesize:        1302528
+    maxprot:         3
+    initprot:        3
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140736937222144
+    vmsize:          219267072
+    fileoff:         971968512
+    filesize:        219267072
+    maxprot:         1
+    initprot:        1
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140737486258176
+    vmsize:          4096
+    fileoff:         1191235584
+    filesize:        4096
+    maxprot:         1
+    initprot:        1
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         ''
+    vmaddr:          140737487028224
+    vmsize:          4096
+    fileoff:         1191239680
+    filesize:        4096
+    maxprot:         5
+    initprot:        5
+    nsects:          0
+    flags:           0
+...
diff --git a/lldb/test/API/python_api/event/TestEvents.py 
b/lldb/test/API/python_api/event/TestEvents.py
index fb1a7e3bc6d3a..9b73a0e2e1e04 100644
--- a/lldb/test/API/python_api/event/TestEvents.py
+++ b/lldb/test/API/python_api/event/TestEvents.py
@@ -411,8 +411,9 @@ def test_shadow_listener(self):
         self.runCmd(f"command script import {stop_hook_path}")
         import stop_hook
 
+        # Add our stop hook here, don't report on the initial attach:
         self.runCmd(
-            f"target stop-hook add -P stop_hook.StopHook -k instance -v 
{self.instance}"
+            f"target stop-hook add -P stop_hook.StopHook -k instance -v 
{self.instance} -F false"
         )
         self.stop_counter = 0
 

>From 3ba6a55a2821313db5554aee7fedd0bafb4d3bde Mon Sep 17 00:00:00 2001
From: Jim Ingham <jing...@apple.com>
Date: Fri, 25 Apr 2025 16:57:25 -0700
Subject: [PATCH 2/2] reformatting

---
 lldb/include/lldb/Target/Target.h               |  4 ++--
 lldb/source/Commands/CommandObjectTarget.cpp    |  4 ++--
 lldb/source/Target/Target.cpp                   | 17 ++++++++---------
 .../commands/target/stop-hooks/TestStopHooks.py |  1 -
 .../on-core-load/TestStopHookOnCoreLoad.py      | 16 ++++++++--------
 .../target/stop-hooks/on-core-load/stop_hook.py | 10 ++++++----
 6 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/lldb/include/lldb/Target/Target.h 
b/lldb/include/lldb/Target/Target.h
index 7aa1fd18233c2..7e89d31761aa7 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -1369,11 +1369,11 @@ class Target : public 
std::enable_shared_from_this<Target>,
     }
 
     bool GetAutoContinue() const { return m_auto_continue; }
-    
+
     void SetRunAtFirstStop(bool at_first_stop) {
       m_at_first_stop = at_first_stop;
     }
-    
+
     bool GetRunAtFirstStop() const { return m_at_first_stop; }
 
     void GetDescription(Stream &s, lldb::DescriptionLevel level) const;
diff --git a/lldb/source/Commands/CommandObjectTarget.cpp 
b/lldb/source/Commands/CommandObjectTarget.cpp
index 3f73157155a02..d162846bad8d8 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -4795,7 +4795,7 @@ class CommandObjectTargetStopHookAdd : public 
CommandObjectParsed,
         m_use_one_liner = true;
         m_one_liner.push_back(std::string(option_arg));
         break;
-        
+
       case 'F': {
         bool value, success;
         value = OptionArgParser::ToBoolean(option_arg, false, &success);
@@ -5019,7 +5019,7 @@ Filter Options:
 
     if (specifier_up)
       new_hook_sp->SetSpecifier(specifier_up.release());
-      
+
     // Should we run at first stop:
     new_hook_sp->SetRunAtFirstStop(m_options.m_at_first_stop);
 
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 3b31f6d0406a5..473cd3afc0d0c 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -3056,9 +3056,9 @@ bool Target::RunStopHooks(bool at_initial_stop) {
 
   bool no_active_hooks =
       llvm::none_of(m_stop_hooks, [at_initial_stop](auto &p) {
-      bool should_run_now = !at_initial_stop || p.second->GetRunAtFirstStop();
-      return p.second->IsActive() && should_run_now; 
-  });
+        bool should_run_now = !at_initial_stop || 
p.second->GetRunAtFirstStop();
+        return p.second->IsActive() && should_run_now;
+      });
   if (no_active_hooks)
     return false;
 
@@ -3096,14 +3096,13 @@ bool Target::RunStopHooks(bool at_initial_stop) {
   if (num_exe_ctx == 0) {
     if (at_initial_stop && num_threads > 0) {
       lldb::ThreadSP thread_to_use_sp = cur_threadlist.GetThreadAtIndex(0);
-      exc_ctx_with_reasons.emplace_back(m_process_sp.get(),
-                                        thread_to_use_sp.get(),
-                                        
thread_to_use_sp->GetStackFrameAtIndex(0).get());
+      exc_ctx_with_reasons.emplace_back(
+          m_process_sp.get(), thread_to_use_sp.get(),
+          thread_to_use_sp->GetStackFrameAtIndex(0).get());
       num_exe_ctx = 1;
     } else
       return false;
   }
-  
 
   StreamSP output_sp = m_debugger.GetAsyncOutputStream();
   auto on_exit = llvm::make_scope_exit([output_sp] { output_sp->Flush(); });
@@ -3604,8 +3603,8 @@ Status Target::Attach(ProcessAttachInfo &attach_info, 
Stream *stream) {
           std::nullopt, nullptr, false, attach_info.GetHijackListener(), 
stream,
           true, SelectMostRelevantFrame);
       process_sp->RestoreProcessEvents();
-      
-      // Run the stop hooks here.  Since we were hijacking the events, they 
+
+      // Run the stop hooks here.  Since we were hijacking the events, they
       // wouldn't have gotten run as part of event delivery.
       RunStopHooks(true /* at_initial_stop */);
 
diff --git a/lldb/test/API/commands/target/stop-hooks/TestStopHooks.py 
b/lldb/test/API/commands/target/stop-hooks/TestStopHooks.py
index 2d13b06d09c1a..7a206486bf63e 100644
--- a/lldb/test/API/commands/target/stop-hooks/TestStopHooks.py
+++ b/lldb/test/API/commands/target/stop-hooks/TestStopHooks.py
@@ -109,4 +109,3 @@ def before_and_after_target(self):
         self.expect(
             "target stop-hook list", substrs=["expr g_var++", "thread 
backtrace"]
         )
-        
diff --git 
a/lldb/test/API/commands/target/stop-hooks/on-core-load/TestStopHookOnCoreLoad.py
 
b/lldb/test/API/commands/target/stop-hooks/on-core-load/TestStopHookOnCoreLoad.py
index 364a85fdd84ae..fa142de949057 100644
--- 
a/lldb/test/API/commands/target/stop-hooks/on-core-load/TestStopHookOnCoreLoad.py
+++ 
b/lldb/test/API/commands/target/stop-hooks/on-core-load/TestStopHookOnCoreLoad.py
@@ -22,15 +22,14 @@ def test_hook_runs_no_threads(self):
         core_path = self.getBuildArtifact("test.core")
         self.yaml2obj("test.core.yaml", core_path)
 
-       # Since mach core files don't have stop reasons, we should choose
-       # the first thread:
+        # Since mach core files don't have stop reasons, we should choose
+        # the first thread:
         self.do_test(core_path, 1)
 
     def test_hook_one_thread(self):
         core_path = os.path.join(self.getSourceDir(), "linux-x86_64.core")
         self.do_test(core_path, 3)
 
-        
     def do_test(self, core_path, stop_thread):
         # Set debugger into synchronous mode
         self.dbg.SetAsync(False)
@@ -42,14 +41,15 @@ def do_test(self, core_path, stop_thread):
         stop_hook_path = os.path.join(self.getSourceDir(), "stop_hook.py")
         self.runCmd(f"command script import {stop_hook_path}")
         self.runCmd("target stop-hook add -P stop_hook.stop_handler")
-        
+
         # Load core.
         process = target.LoadCore(core_path)
         self.assertTrue(process, PROCESS_IS_VALID)
-       # Now run our report command and make sure we get the right answer.
-        
+        # Now run our report command and make sure we get the right answer.
+
         result = lldb.SBCommandReturnObject()
         self.dbg.GetCommandInterpreter().HandleCommand("report_command", 
result)
         print(f"Command Output: '{result.GetOutput}'")
-        self.assertIn(f"Stop Threads: {stop_thread}", result.GetOutput(), "Ran 
the stop hook")
-        
+        self.assertIn(
+            f"Stop Threads: {stop_thread}", result.GetOutput(), "Ran the stop 
hook"
+        )
diff --git a/lldb/test/API/commands/target/stop-hooks/on-core-load/stop_hook.py 
b/lldb/test/API/commands/target/stop-hooks/on-core-load/stop_hook.py
index ba8215e69dc42..d976d2e093ff1 100644
--- a/lldb/test/API/commands/target/stop-hooks/on-core-load/stop_hook.py
+++ b/lldb/test/API/commands/target/stop-hooks/on-core-load/stop_hook.py
@@ -1,5 +1,6 @@
 import lldb
 
+
 def report_command(debugger, command, exe_ctx, result, internal_dict):
     global stop_thread
     print(f"About to report out stop_thread: {stop_thread}")
@@ -7,7 +8,8 @@ def report_command(debugger, command, exe_ctx, result, 
internal_dict):
     result.AppendMessage(mssg)
 
     result.SetStatus(lldb.eReturnStatusSuccessFinishResult)
-    
+
+
 class stop_handler:
     def __init__(self, target, extra_args, dict):
         global stop_thread
@@ -19,10 +21,10 @@ def handle_stop(self, exe_ctx, stream):
         thread = exe_ctx.thread
         stop_thread = thread.idx
 
+
 def __lldb_init_module(debugger, internal_dict):
     global stop_thread
     stop_thread = 0
     debugger.HandleCommand(
-           f"command script add -o -f '{__name__}.report_command' 
report_command"
-)
-
+        f"command script add -o -f '{__name__}.report_command' report_command"
+    )

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to