From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Thu, 4 Jun 2026 08:31:47 +0000 (+0200) Subject: [3.15] gh-149521: Do not update `last_profiled_frame` if it's not changed (GH-149522... X-Git-Tag: v3.15.0b3~177 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=624384d97405f071da94321505ef160c987cac50;p=thirdparty%2FPython%2Fcpython.git [3.15] gh-149521: Do not update `last_profiled_frame` if it's not changed (GH-149522) (#149542) Co-authored-by: Maurycy Pawłowski-Wieroński --- diff --git a/Modules/_remote_debugging/threads.c b/Modules/_remote_debugging/threads.c index 5176c4cf0671..81735e85395a 100644 --- a/Modules/_remote_debugging/threads.c +++ b/Modules/_remote_debugging/threads.c @@ -534,12 +534,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