GoogleCloudPlatform / GoogleCloudPlatform/appengine-python-standard

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

Đang mở
#136 1 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Python
Star
86
Fork
61
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

### 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 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 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 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 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 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 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 "", 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

```python
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
```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
```

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.