benfred / py-spy

Sampling profiler for Python programs
MIT License
12.13k stars 401 forks source link

Fix Python 3.11 native sampling #635

Closed krfricke closed 7 months ago

krfricke commented 7 months ago

In Python 3.11, merging native frames works a bit differently. We have to detect if a frame is an "entry frame". Once we hit a native frame that corresponds to python, we need to keep merging python frames until we hit the entry frame.

pystack does it very similarly: https://sourcegraph.com/github.com/bloomberg/pystack/-/blob/src/pystack/_pystack/pyframe.cpp?L73-104

Confirmed this works for me in a "sandwiched" environment, where Python calls Rust, which calls Python again, as well as the simple example from #634.

Closes #634, #617, presumably also #558