]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-149521: Do not update `last_profiled_frame` if it's not changed (#149522)
authorMaurycy Pawłowski-Wieroński <maurycy@maurycy.com>
Fri, 8 May 2026 08:25:49 +0000 (10:25 +0200)
committerGitHub <noreply@github.com>
Fri, 8 May 2026 08:25:49 +0000 (08:25 +0000)
Modules/_remote_debugging/threads.c

index d775234b8d78d723eb6e855fe8213829b1739640..4daa5e5f92bcd9764c8f173694da1833f277a3d8 100644 (file)
@@ -450,12 +450,14 @@ unwind_stack_for_thread(
             set_exception_cause(unwinder, PyExc_RuntimeError, "Failed to collect frames");
             goto error;
         }
-        // Update last_profiled_frame for next sample
-        uintptr_t lpf_addr =
-            *current_tstate + (uintptr_t)unwinder->debug_offsets.thread_state.last_profiled_frame;
-        if (_Py_RemoteDebug_WriteRemoteMemory(&unwinder->handle, lpf_addr,
-                                              sizeof(uintptr_t), &frame_addr) < 0) {
-            PyErr_Clear();  // Non-fatal
+        // Update last_profiled_frame for next sample if it changed
+        if (frame_addr != ctx.last_profiled_frame) {
+            uintptr_t lpf_addr =
+                *current_tstate + (uintptr_t)unwinder->debug_offsets.thread_state.last_profiled_frame;
+            if (_Py_RemoteDebug_WriteRemoteMemory(&unwinder->handle, lpf_addr,
+                                                  sizeof(uintptr_t), &frame_addr) < 0) {
+                PyErr_Clear();  // Non-fatal
+            }
         }
     } else {
         // No caching - process entire frame chain with base_frame validation