---
# System prepended metadata

title: Celery_Debugging
tags: [celery 5.2, python, celery]

---

# Celery_Debugging
###### tags: `celery` `celery 5.2` `python`


[官方連結_Debugging](https://docs.celeryq.dev/en/master/userguide/debugging.html)
## Debugging
### Debugging Tasks Remotely (using pdb)
#### Basics
[celery.contrib.rdb](https://docs.celeryq.dev/en/master/reference/celery.contrib.rdb.html#module-celery.contrib.rdb)是[pdb](https://docs.python.org/dev/library/pdb.html#module-pdb)的擴展版本，允許對沒有終端存取權限的進程(process)進行遠端除錯。

使用範例：
```python
from celery import task
from celery.contrib import rdb

@task()
def add(x, y):
    result = x + y
    rdb.set_trace()  # <- set break-point
    return result
```

[set_trace()](https://docs.celeryq.dev/en/master/reference/celery.contrib.rdb.html#celery.contrib.rdb.set_trace)，在當前位置設置一個中斷點(break-point)，然後建立一個可以遠端登入並且針對任務除錯的socket。

除錯工具可能會被多個processes同時啟動，因此除錯工具會從基本埠開始搜尋可用的埠(預設由6900開始)，而不是固定埠。基本埠可以用環境變數[CELERY_RDB_PORT](https://docs.celeryq.dev/en/master/reference/celery.contrib.rdb.html#envvar-CELERY_RDB_PORT)來調整。

預設情況下，除錯工具僅可以在本機使用，如果要從外部登入，你必須設置環境變數[CELERY_RDB_HOST](https://docs.celeryq.dev/en/master/reference/celery.contrib.rdb.html#envvar-CELERY_RDB_HOST)

當Worker遇到設置的中斷點，它將記錄下列資訊：
:::info
[INFO/MainProcess] Received task:
    tasks.add[d7261c71-4962-47e5-b342-2448bedd20e8]
[WARNING/PoolWorker-1] Remote Debugger:6900:
    Please telnet 127.0.0.1 6900.  Type `exit` in session to continue.
[2011-01-18 14:25:44,119: WARNING/PoolWorker-1] Remote Debugger:6900:
    Waiting for client...
:::

如果你通過指定埠做終端登錄，你將會看到`pdb` shell：
```shell
$ telnet localhost 6900
Connected to localhost.
Escape character is '^]'.
> /opt/devel/demoapp/tasks.py(128)add()
-> return result
(Pdb)
```

輸入`help`就可以取得可用的命令列表，如果你從來沒有使用過`pdb`，那閱讀[Python Debugger Manual](https://docs.python.org/3/library/pdb.html)或許是個不錯的選擇。

為了演示，我們會讀取變數`result`的值，改變它，然後繼續執行任務：
```python
(Pdb) result
4
(Pdb) result = 'hello from rdb'
(Pdb) continue
Connection closed by foreign host.
```

我們變更`result`的行為可以在Worker的日誌上看的到：
```shell
[2011-01-18 14:35:36,599: INFO/MainProcess] Task
    tasks.add[d7261c71-4962-47e5-b342-2448bedd20e8] succeeded
    in 61.481s: 'hello from rdb'
```
### Tips
#### Enabling the break-point signal
如果環境變數**CELERY_RDBSIG**已經設置了，那Worker會開啟一個`rdb`實例，不論`SIGUSR2`這個信號(signal)是否發送。主要的process與Worker process都是這種情況。

舉例來說，啟動Worker：
```shell
$ CELERY_RDBSIG=1 celery worker -l info
```

你可以透過下面的執行對任何一個Worker process啟動一個`rdb session`：
```shell
$ kill -USR2 <pid>
```

## History
20190923_依據4.4版本說明翻譯
20220523_依據5.2版本說明翻譯