Bye AB(B)A and friends!#5
Open
maurycy wants to merge 4 commits into
Open
Conversation
Fixes python#151613. The remote debugging frame cache previously used only the last_profiled_frame address as its cache anchor. If a frame returned and a later frame reused the same _PyInterpreterFrame address, the profiler could accept a stale cache entry and splice parent frames from a different call chain into the current stack. This adds a last_profiled_frame_seq counter next to last_profiled_frame, increments it when the anchor advances, stores it in frame cache entries, and validates cache hits against both the frame address and the sequence. Cache miss walks now copy stack chunks before storing new cache entries so stored continuations come from a stable snapshot. The new regression test exercises alternating call chains and checks that cached stacks never contain frames from both branches.
Owner
Author
2026-06-20T01:59:23.784612000+0200 maurycy@gimel /Users/maurycy/Desktop/pr (main a9ad18d) % ./run.sh ~/work/cpython-main/python.exe ~/work/cpython-pablo/python.exe ~/work/cpython-b792693/python.exe ~/work/cpython/python.exe
########## /Users/maurycy/work/cpython-main/python.exe ##########
Python 3.16.0a0 (heads/main:a8d74c062fe, Jun 19 2026, 15:26:24) [Clang 21.0.0 (clang-2100.1.1.101)]
=== 01_interchunk.py ===
seen=45776 cross=11748 (25.66%)
{'total_samples': 100000, 'frame_cache_hits': 0, 'frame_cache_misses': 0, 'frame_cache_partial_hits': 0, 'frames_read_from_cache': 0, 'frames_read_from_memory': 0, 'memory_reads': 908228, 'memory_bytes_read': 159124064, 'code_object_cache_hits': 4477835, 'code_object_cache_misses': 4, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 0.0, 'code_object_cache_hit_rate': 99.99991067119653, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 02_gi_iframe.py ===
cache=True seen=60448 impossible=5306 (8.8%)
{'total_samples': 100000, 'frame_cache_hits': 53, 'frame_cache_misses': 83325, 'frame_cache_partial_hits': 0, 'frames_read_from_cache': 0, 'frames_read_from_memory': 224227, 'memory_reads': 342006, 'memory_bytes_read': 109296528, 'code_object_cache_hits': 320157, 'code_object_cache_misses': 170, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 0.06356592866223704, 'code_object_cache_hit_rate': 99.94692923169137, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 03_pr151614.py ===
seen=99944 mixed=846 (0.85%)
example mixed: ['burn_b', 'a_leaf', 'a_parent', '<module>']
{'total_samples': 100000, 'frame_cache_hits': 22993, 'frame_cache_misses': 76975, 'frame_cache_partial_hits': 9, 'frames_read_from_cache': 68994, 'frames_read_from_memory': 330762, 'memory_reads': 276943, 'memory_bytes_read': 103570984, 'code_object_cache_hits': 407729, 'code_object_cache_misses': 7, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 23.00729167708573, 'code_object_cache_hit_rate': 99.99828320285675, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 04_sharedleaf.py ===
cache=True seen=99940 impossible=893 (0.89%)
{'total_samples': 100000, 'frame_cache_hits': 22420, 'frame_cache_misses': 77560, 'frame_cache_partial_hits': 4, 'frames_read_from_cache': 44844, 'frames_read_from_memory': 255037, 'memory_reads': 277542, 'memory_bytes_read': 103623696, 'code_object_cache_hits': 332592, 'code_object_cache_misses': 4, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 22.427588414146264, 'code_object_cache_hit_rate': 99.99879733971545, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
########## /Users/maurycy/work/cpython-pablo/python.exe ##########
Python 3.16.0a0 (heads/gh-151613-remote-debugging-frame-cache-aba:fc9fafd7699, Jun 20 2026, 00:31) [Clang 21.0.0 (clang-2100.1.1.101)]
=== 01_interchunk.py ===
seen=44294 cross=13004 (29.36%)
{'total_samples': 100000, 'frame_cache_hits': 0, 'frame_cache_misses': 0, 'frame_cache_partial_hits': 0, 'frames_read_from_cache': 0, 'frames_read_from_memory': 0, 'memory_reads': 986327, 'memory_bytes_read': 166796776, 'code_object_cache_hits': 4285518, 'code_object_cache_misses': 4, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 0.0, 'code_object_cache_hit_rate': 99.99990666247892, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 02_gi_iframe.py ===
cache=True seen=60052 impossible=6154 (10.2%)
{'total_samples': 100000, 'frame_cache_hits': 74, 'frame_cache_misses': 83547, 'frame_cache_partial_hits': 0, 'frames_read_from_cache': 3, 'frames_read_from_memory': 223858, 'memory_reads': 341807, 'memory_bytes_read': 110079016, 'code_object_cache_hits': 319599, 'code_object_cache_misses': 177, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 0.08849451692756605, 'code_object_cache_hit_rate': 99.94464875412788, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 03_pr151614.py ===
seen=99963 mixed=609 (0.61%)
example mixed: ['burn_b', 'a_leaf', 'a_parent', '<module>']
{'total_samples': 100000, 'frame_cache_hits': 21826, 'frame_cache_misses': 78152, 'frame_cache_partial_hits': 6, 'frames_read_from_cache': 65488, 'frames_read_from_memory': 334356, 'memory_reads': 278526, 'memory_bytes_read': 104510288, 'code_object_cache_hits': 412882, 'code_object_cache_misses': 7, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 21.835493678988637, 'code_object_cache_hit_rate': 99.99830462908918, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 04_sharedleaf.py ===
cache=True seen=99957 impossible=576 (0.58%)
{'total_samples': 100000, 'frame_cache_hits': 21738, 'frame_cache_misses': 78239, 'frame_cache_partial_hits': 8, 'frames_read_from_cache': 43484, 'frames_read_from_memory': 256430, 'memory_reads': 278642, 'memory_bytes_read': 104520496, 'code_object_cache_hits': 335070, 'code_object_cache_misses': 4, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 21.749262389358403, 'code_object_cache_hit_rate': 99.99880623384685, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
########## /Users/maurycy/work/cpython-b792693/python.exe ##########
Python 3.16.0a0 (heads/gh-151613-remote-debugging-frame-cache-aba-1-gb792693cde2-dirty:b792693cde) [Clang 21.0.0 (clang-2100.1.1.101)]
=== 01_interchunk.py ===
seen=42947 cross=11504 (26.79%)
{'total_samples': 100000, 'frame_cache_hits': 0, 'frame_cache_misses': 0, 'frame_cache_partial_hits': 0, 'frames_read_from_cache': 0, 'frames_read_from_memory': 0, 'memory_reads': 815694, 'memory_bytes_read': 151781072, 'code_object_cache_hits': 4028906, 'code_object_cache_misses': 4, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 0.0, 'code_object_cache_hit_rate': 99.9999007175638, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 02_gi_iframe.py ===
cache=True seen=61453 impossible=3172 (5.2%)
{'total_samples': 100000, 'frame_cache_hits': 0, 'frame_cache_misses': 83471, 'frame_cache_partial_hits': 0, 'frames_read_from_cache': 0, 'frames_read_from_memory': 225035, 'memory_reads': 343117, 'memory_bytes_read': 110194296, 'code_object_cache_hits': 320925, 'code_object_cache_misses': 148, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 0.0, 'code_object_cache_hit_rate': 99.95390456375965, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 03_pr151614.py ===
seen=99964 mixed=0 (0.00%)
{'total_samples': 100000, 'frame_cache_hits': 22483, 'frame_cache_misses': 77491, 'frame_cache_partial_hits': 3, 'frames_read_from_cache': 67452, 'frames_read_from_memory': 332400, 'memory_reads': 277862, 'memory_bytes_read': 104451856, 'code_object_cache_hits': 410265, 'code_object_cache_misses': 7, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 22.49117296978305, 'code_object_cache_hit_rate': 99.99829381483504, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 04_sharedleaf.py ===
cache=True seen=99960 impossible=1 (0.00%)
{'total_samples': 100000, 'frame_cache_hits': 21883, 'frame_cache_misses': 78102, 'frame_cache_partial_hits': 2, 'frames_read_from_cache': 43768, 'frames_read_from_memory': 256150, 'memory_reads': 278488, 'memory_bytes_read': 104506944, 'code_object_cache_hits': 334643, 'code_object_cache_misses': 4, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 21.887845419904586, 'code_object_cache_hit_rate': 99.99880471063538, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
########## /Users/maurycy/work/cpython/python.exe ##########
Python 3.16.0a0 (heads/maurycy/bye-abba:6024fc7edf6, Jun 20 2026, 00:27:45) [Clang 21.0.0 (clang-2100.1.1.101)]
=== 01_interchunk.py ===
seen=6084 cross=8 (0.13%)
{'total_samples': 100000, 'frame_cache_hits': 0, 'frame_cache_misses': 0, 'frame_cache_partial_hits': 0, 'frames_read_from_cache': 0, 'frames_read_from_memory': 0, 'memory_reads': 2671907, 'memory_bytes_read': 315127816, 'code_object_cache_hits': 10596616, 'code_object_cache_misses': 4, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 0.0, 'code_object_cache_hit_rate': 99.99996225211436, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 02_gi_iframe.py ===
cache=True seen=190 impossible=48 (25.3%)
{'total_samples': 100000, 'frame_cache_hits': 24, 'frame_cache_misses': 209481, 'frame_cache_partial_hits': 0, 'frames_read_from_cache': 48, 'frames_read_from_memory': 563809, 'memory_reads': 710092, 'memory_bytes_read': 142488096, 'code_object_cache_hits': 803475, 'code_object_cache_misses': 431, 'stale_cache_invalidations': 42, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 0.011455573852652681, 'code_object_cache_hit_rate': 99.94638676661202, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 03_pr151614.py ===
seen=99953 mixed=671 (0.67%)
example mixed: ['burn_a', 'b_leaf', 'b_parent', '<module>']
{'total_samples': 100000, 'frame_cache_hits': 26187, 'frame_cache_misses': 76146, 'frame_cache_partial_hits': 6, 'frames_read_from_cache': 78569, 'frames_read_from_memory': 330690, 'memory_reads': 278986, 'memory_bytes_read': 104550768, 'code_object_cache_hits': 407309, 'code_object_cache_misses': 7, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 25.59434819570252, 'code_object_cache_hit_rate': 99.99828143259779, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
=== 04_sharedleaf.py ===
cache=True seen=99971 impossible=644 (0.64%)
{'total_samples': 100000, 'frame_cache_hits': 25033, 'frame_cache_misses': 77207, 'frame_cache_partial_hits': 6, 'frames_read_from_cache': 50072, 'frames_read_from_memory': 256636, 'memory_reads': 279896, 'memory_bytes_read': 104630848, 'code_object_cache_hits': 334279, 'code_object_cache_misses': 4, 'stale_cache_invalidations': 0, 'batched_read_attempts': 0, 'batched_read_successes': 0, 'batched_read_misses': 0, 'batched_read_segments_requested': 0, 'batched_read_segments_completed': 0, 'frame_cache_hit_rate': 24.48897756391448, 'code_object_cache_hit_rate': 99.99880340908751, 'batched_read_success_rate': 0.0, 'batched_read_segment_completion_rate': 0.0}
2026-06-20T02:06:42.145696000+0200 maurycy@gimel /Users/maurycy/Desktop/pr (main a9ad18d) % |
This reverts commit 6024fc7.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Scripts below:
Basic harness
run.sh:Inter{page,chunk} repro:
gi_iframerepro:Repro from python#151614
Shared leaf repro: