Skip to content

google.appengine.api.wrap_wsgi_app() breaks vscode debugger (debugpy) #136

@mrbaguettefr

Description

@mrbaguettefr

Context

Migrating a GAE from Python 2 to Python 3 using legacy bundled services (memcache and deferred).

Expected Behavior

The GAE app can be debugged using debugpy in vscode.

Actual Behavior

After adding a breakpoint on line 4 or 5 in file main.py and hitting with a browser (or curl) http://localhost:8000, the debugger hangs.
Commenting out line 7 (with the call to wrap_wsgi_app() ) and restarting the server temporary removes the issue (but memcache/deferred services are not working).
Same behavior when running using google-cloud-sdk/bin/dev_appserver.py to start gunicorn

When killing the worker, the following traceback is printed:

Traceback

[2025-06-11 17:07:47 +0200] [819688] [INFO] Starting gunicorn 23.0.0
[2025-06-11 17:07:47 +0200] [819688] [INFO] Listening at: http://127.0.0.1:8000 (819688)
[2025-06-11 17:07:47 +0200] [819688] [INFO] Using worker: sync
[2025-06-11 17:07:48 +0200] [819706] [INFO] Booting worker with pid: 819706
^C[2025-06-11 17:13:46 +0200] [819688] [INFO] Handling signal: int
[2025-06-11 17:13:46 +0200] [819706] [ERROR] Error handling request /favicon.ico
Traceback (most recent call last):
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/gunicorn/workers/sync.py", line 134, in handle
    self.handle_request(listener, req, client, addr)
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/gunicorn/workers/sync.py", line 177, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 82, in <lambda>
    lambda app: lambda wsgi_env, start_resp: f(app, wsgi_env, start_resp),
                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 306, in InitLegacyRequestOsEnvironMiddleware
    return app(wsgi_env, start_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 82, in <lambda>
    lambda app: lambda wsgi_env, start_resp: f(app, wsgi_env, start_resp),
                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 362, in RunInNewContextMiddleware
    return ctx.run(app, wsgi_env, start_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 82, in <lambda>
    lambda app: lambda wsgi_env, start_resp: f(app, wsgi_env, start_resp),
                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 222, in SetContextFromHeadersMiddleware
    return app(wsgi_env, start_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 82, in <lambda>
    lambda app: lambda wsgi_env, start_resp: f(app, wsgi_env, start_resp),
                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 339, in CallbackMiddleware
    return app(wsgi_env, start_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 82, in <lambda>
    lambda app: lambda wsgi_env, start_resp: f(app, wsgi_env, start_resp),
                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 108, in UseRequestSecurityTicketForApiMiddleware
    return app(wsgi_env, start_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 82, in <lambda>
    lambda app: lambda wsgi_env, start_resp: f(app, wsgi_env, start_resp),
                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/google/appengine/runtime/middlewares.py", line 133, in WaitForResponseMiddleware
    return list(app(wsgi_env, start_response))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/projects/python-debug-test/main.py", line 5, in app
    yield b'Hello world!\n'
          ^^^^^^^^^^^^^^^^^
  File "<stringsource>", line 69, in cfunc.to_py.__Pyx_CFunc_b0409f__29_pydevd_sys_monitoring_cython_object__lParen__etc_to_py_4code_4line.wrap
  File "_pydevd_sys_monitoring\\_pydevd_sys_monitoring_cython.pyx", line 1470, in _pydevd_sys_monitoring_cython._line_event
  File "_pydevd_sys_monitoring\\_pydevd_sys_monitoring_cython.pyx", line 1512, in _pydevd_sys_monitoring_cython._internal_line_event
  File "_pydevd_sys_monitoring\\_pydevd_sys_monitoring_cython.pyx", line 1313, in _pydevd_sys_monitoring_cython._stop_on_breakpoint
  File "_pydevd_sys_monitoring\\_pydevd_sys_monitoring_cython.pyx", line 1950, in _pydevd_sys_monitoring_cython._do_wait_suspend
  File "/home/tony/.vscode-server/extensions/ms-python.debugpy-2025.8.0-linux-x64/bundled/libs/debugpy/_vendored/pydevd/pydevd.py", line 2188, in do_wait_suspend
    keep_suspended = self._do_wait_suspend(thread, frame, event, arg, trace_suspend_type, from_this_thread, frames_tracker)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.vscode-server/extensions/ms-python.debugpy-2025.8.0-linux-x64/bundled/libs/debugpy/_vendored/pydevd/pydevd.py", line 2257, in _do_wait_suspend
    notify_event.wait(wait_timeout)
  File "/usr/lib/python3.12/threading.py", line 655, in wait
    signaled = self._cond.wait(timeout)
               ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/threading.py", line 359, in wait
    gotit = waiter.acquire(True, timeout)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/gunicorn/workers/base.py", line 198, in handle_quit
    time.sleep(0.1)
  File "/home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/lib/python3.12/site-packages/gunicorn/workers/base.py", line 199, in handle_quit
    sys.exit(0)
SystemExit: 0
[2025-06-11 17:13:46 +0200] [819706] [INFO] Worker exiting (pid: 819706)
Exception ignored in thread started by: <_pydev_bundle.pydev_monkey._NewThreadStartupWithTrace object at 0x730b1afb9a30>
Traceback (most recent call last):
  File "/home/tony/.vscode-server/extensions/ms-python.debugpy-2025.8.0-linux-x64/bundled/libs/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py", line 1131, in __call__
    ret = self.original_func(*self.args, **self.kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/threading.py", line 1030, in _bootstrap
    self._bootstrap_inner()
  File "/usr/lib/python3.12/threading.py", line 1077, in _bootstrap_inner
    self._delete()
  File "/usr/lib/python3.12/threading.py", line 1109, in _delete
    del _active[get_ident()]
        ~~~~~~~^^^^^^^^^^^^^
KeyError: 126491543201472
Exception ignored in thread started by: <_pydev_bundle.pydev_monkey._NewThreadStartupWithTrace object at 0x730b1afb9b50>
Traceback (most recent call last):
  File "/home/tony/.vscode-server/extensions/ms-python.debugpy-2025.8.0-linux-x64/bundled/libs/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py", line 1131, in __call__
    ret = self.original_func(*self.args, **self.kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/threading.py", line 1030, in _bootstrap
    self._bootstrap_inner()
  File "/usr/lib/python3.12/threading.py", line 1077, in _bootstrap_inner
    self._delete()
  File "/usr/lib/python3.12/threading.py", line 1109, in _delete
    del _active[get_ident()]
        ~~~~~~~^^^^^^^^^^^^^
KeyError: 126491551594176
Exception ignored in thread started by: <_pydev_bundle.pydev_monkey._NewThreadStartupWithTrace object at 0x730b1afb86e0>
Traceback (most recent call last):
  File "/home/tony/.vscode-server/extensions/ms-python.debugpy-2025.8.0-linux-x64/bundled/libs/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py", line 1131, in __call__
    [2025-06-11 17:13:47 +0200] [819688] [INFO] Shutting down: Master

Steps to Reproduce the Problem

  • Create the example app (2 files listed bellow)
  • Set up the debugger via .vscode/launch.json

main.py

import google.appengine.api

def app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield b'Hello world!\n'

app = google.appengine.api.wrap_wsgi_app(app)

.vscode/launch.json

{
    "version": "0.2.0",
    "configurations": [

        {
            "name": "gunicorn",
            "type": "debugpy",
            "request": "launch",
            "module": "gunicorn",
            "args": [
                "--timeout=0",
                "--workers=1",
                "main:app"
            ]
        }
    ]
}
$ poetry show -T
appengine-python-standard 1.1.10    Google App Engine services SDK for Python 3
gunicorn                  23.0.0    WSGI HTTP Server for UNIX
$ poetry env info

Virtualenv
Python:         3.12.3
Implementation: CPython
Path:           /home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12
Executable:     /home/tony/.cache/pypoetry/virtualenvs/python-debug-test-dEh-hs7b-py3.12/bin/python
Valid:          True

Base
Platform:   linux
OS:         posix
Python:     3.12.3
Path:       /usr
Executable: /usr/bin/python3.12

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions