plasma-umass / slipcover

Near Zero-Overhead Python Code Coverage
Apache License 2.0
475 stars 17 forks source link

Slipcover segfaults on Python 3.11 #53

Closed LilyFoote closed 4 months ago

LilyFoote commented 4 months ago

I was looking into using slipcover and I almost immediately ran into this segfault:

slipcover -m pytest
=============================================== test session starts ================================================
platform linux -- Python 3.11.6, pytest-8.1.1, pluggy-1.5.0
rootdir: /home/lily/work/kloppindustries/slipcover-segfault
plugins: kolo-2.23.0, anyio-4.3.0
collected 1 item                                                                                                   

tests/test_async.py Fatal Python error: Segmentation fault

Current thread 0x00007f235bea3740 (most recent call first):
  File "/home/lily/work/kloppindustries/slipcover-segfault/tests/test_async.py", line 6 in async_add
  File "/home/lily/work/kloppindustries/slipcover-segfault/tests/test_async.py", line 12 in slow_add
  File "/home/lily/.local/share/lilyenv/pythons/3.11/python/lib/python3.11/asyncio/events.py", line 80 in _run
  File "/home/lily/.local/share/lilyenv/pythons/3.11/python/lib/python3.11/asyncio/base_events.py", line 1922 in _run_once
  File "/home/lily/.local/share/lilyenv/pythons/3.11/python/lib/python3.11/asyncio/base_events.py", line 607 in run_forever
  File "/home/lily/.local/share/lilyenv/pythons/3.11/python/lib/python3.11/asyncio/base_events.py", line 640 in run_until_complete
  File "/home/lily/.local/share/lilyenv/pythons/3.11/python/lib/python3.11/asyncio/runners.py", line 118 in run
  File "/home/lily/.local/share/lilyenv/pythons/3.11/python/lib/python3.11/asyncio/runners.py", line 190 in run
  File "/home/lily/work/kloppindustries/slipcover-segfault/tests/test_async.py", line 21 in test_profile_tasks
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/python.py", line 195 in pytest_pyfunc_call
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_callers.py", line 103 in _multicall
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_manager.py", line 120 in _hookexec
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_hooks.py", line 513 in __call__
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/python.py", line 1772 in runtest
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/runner.py", line 172 in pytest_runtest_call
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_callers.py", line 103 in _multicall
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_manager.py", line 120 in _hookexec
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_hooks.py", line 513 in __call__
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/runner.py", line 240 in <lambda>
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/runner.py", line 340 in from_call
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/runner.py", line 239 in call_and_report
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/runner.py", line 134 in runtestprotocol
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/runner.py", line 115 in pytest_runtest_protocol
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_callers.py", line 103 in _multicall
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_manager.py", line 120 in _hookexec
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_hooks.py", line 513 in __call__
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/main.py", line 364 in pytest_runtestloop
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_callers.py", line 103 in _multicall
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_manager.py", line 120 in _hookexec
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_hooks.py", line 513 in __call__
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/main.py", line 339 in _main
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/main.py", line 285 in wrap_session
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/main.py", line 332 in pytest_cmdline_main
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_callers.py", line 103 in _multicall
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_manager.py", line 120 in _hookexec
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pluggy/_hooks.py", line 513 in __call__
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/config/__init__.py", line 174 in main
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/_pytest/config/__init__.py", line 197 in console_main
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/pytest/__main__.py", line 7 in <module>
  File "<frozen runpy>", line 88 in _run_code
  File "<frozen runpy>", line 98 in _run_module_code
  File "<frozen runpy>", line 226 in run_module
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/lib/python3.11/site-packages/slipcover/__main__.py", line 266 in main
  File "/home/lily/.local/share/lilyenv/virtualenvs/slipcover-segfault/3.11/bin/slipcover", line 8 in <module>

Extension modules: slipcover.probe, msgpack._cmsgpack (total: 2)
fish: Job 1, 'slipcover -m pytest' terminated by signal SIGSEGV (Address boundary error)

The relevant test code:

# tests/test_async.py
import asyncio

import kolo

async def async_add(*args: int) -> int:
    return sum(args)

async def slow_add(*args: int, time: float) -> int:
    await asyncio.sleep(time)
    return await async_add(*args)

async def multi_add():
    return await asyncio.gather(slow_add(1, 2, time=0.2), slow_add(3, 4, time=0.1))

def test_profile_tasks():
    with kolo.enabled({"use_rust": False}):
        results = asyncio.run(multi_add())
    assert results == [3, 7]

I've also extracted this to a new repo: https://github.com/LilyFoote/slipcover-segfault

LilyFoote commented 4 months ago

This doesn't segfault on Python 3.12, so I assume the bug is in the bytecode re-writing.

jaltmayerpizzorno commented 4 months ago

Hi, thank you for the report! There was indeed a bug instrumenting certain Python 3.11 specific bytecode sequences; fixing it seemingly (I'm not certain) resolves the segfault.