Github: https://github.com/Kozea/wdb
wdb – Webデバッガ
説明
wdbは、クライアント/サーバアーキテクチャに基づいたフル機能のWebデバッガです。
ブラウザ接続(Webソケット経由)と一緒にデバッグインスタンスを管理するwdbサーバは、 Tornadoに基づいています。 wdbクライアントは、ステップバイステップのデバッグ、プログラム内のPythonコードの実行、コードエディタ ( CodeMirrorに基づく)、ブレークポイントの設定を可能にします…
このアーキテクチャのおかげで、このすべてはマルチスレッドおよびマルチプロセスプログラムと完全に互換性があります。
wdbは、Python 2( 2.6,2.7 )、Python 3(3.2,3.3,3.4,3.5)、pypyで動作します。 さらにうまくいって、Python 3で実行されているwdbサーバーを使ってPython 2プログラムをデバッグしたり、逆も可能です。また、デバッグサーバーを別のコンピュータで実行しているプログラムをデバッグすることもできます。
Bettererでも、Webインタフェースからのコードインジェクションを使用して現在実行中のPythonプロセス/スレッドを一時停止することができます。 (これにはgdbとptraceが有効になっている必要があります)
言い換えれば、それは素敵な機能を備えたブラウザのpdbの非常に強化されたバージョンです。
インストール:
グローバルインストール:
$ pip install wdb.server
virtualenvまたは別のpythonインストールで:
$ pip install wdb
(サーバーをインストールして実行している必要があります)
クイックテスト
wdbを試すには、まずwdbサーバを起動する必要があります:
$ wdb.server.py &
オプションで、systemd(ソケット起動)でデーモンを自動的に起動することができます:
$ cd /etc/systemd/system
# curl -O https://raw.githubusercontent.com/Kozea/wdb/master/server/wdb.server.service
# curl -O https://raw.githubusercontent.com/Kozea/wdb/master/server/wdb.server.socket
# systemctl enable wdb.server.socket
# systemctl start wdb.server.socket
次の実行:
$ python -m wdb your_file.py
Wdbはブラウザのデバッグウィンドウを開き、プログラムの先頭で一時停止します。
http:// localhost:1984 /にアクセスして、サーバーの概要を知ることができます。
注:サーバーを一度起動するだけです。 複数のデバッグセッションを問題なく同時に実行できます。
これは、プログラムをデバッグする唯一の方法ではありません。以下を参照してください。
使用法
トレースを設定する
サーバーをオンにして任意のプログラムをデバッグするには、次の行を追加します。
import wdb
wdb.set_trace()
あなたのコードのどこにでも。 プログラムはset_trace行で停止します。 (ちょうどpdbのように)
トレースコード
例外時にコードを検査するには、次のようにします。
from wdb import trace
with trace():
wrong_code()
wrong_code
中に例外がwrong_code
すると、デバッグセッションが開始されます。
start_trace()
およびstop_trace
メソッドを使用することもできます。 ( stop_trace
をfinallyブロックに置いて、例外の後ですべてのプログラムをトレースするのは避けてください)。
Webサーバーのデバッグ
wdbは、さまざまなWebサーバーでうまく動作するようにいくつかのツールを提供しています。
Wsgiサーバー
wsgiサーバーの場合、 WdbMiddleware
を使用することができます:
from wdb.ext import WdbMiddleware
wsgi_app = Whathever_wsgi_server_lib()
my_app = WdbMiddleware(wsgi_app)
my_app.serve_forever()
フラスコ
またはFlaskを使用して:
from flask import Flask
from wdb.ext import WdbMiddleware
app = Flask(__name__)
app.debug = True
app.wsgi_app = WdbMiddleware(app.wsgi_app)
app.run(use_debugger=False) # Disable builtin Werkzeug debugger
Flask-Wdb拡張を使用することもできます
from flask import Flask
from flask_wdb import Wdb
app = Flask(__name__)
app.debug = True
Wdb(app)
app.run()
ジャンゴ
またはdjangoを使用して:
あなたのwsgi.py
ミドルウェアを追加してください:
後:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
これを追加:
from wdb.ext import WdbMiddleware
application = WdbMiddleware(application)
そして、あなたのsettings.py
、例外伝播を有効にしてください:
DEBUG = True
DEBUG_PROPAGATE_EXCEPTIONS = True
CherryPy
またはCherryPyを使用して:
import cherrypy
from wdb.ext import WdbMiddleware
class HelloWorld(object):
@cherrypy.expose
def index(self):
undefined_method() # This will fail
return "Hello World!"
cherrypy.config.update({'global':{'request.throw_errors': True}})
app = cherrypy.Application(HelloWorld())
app.wsgiapp.pipeline.append(('debugger', WdbMiddleware))
cherrypy.quickstart(app)
竜巻
WMSIサーバーではない竜巻では、 wdb_tornado
関数を使用することができます。 wdb_tornado
関数は、RequestHandlersのexecuteメソッドを猿でパッチします。
from wdb.ext import wdb_tornado
from tornado.web import Application
my_app = Application([(r"/", MainHandler)])
if options.debug:
wdb_tornado(my_app)
my_app.listen(8888)
ページ読み込み時間が遅くなる
wdbがアプリケーションの処理速度を低下させる(すべての処理に時間がかかる)場合は、次の方法で無効にすることができます。
my_app = WdbMiddleware(wsgi_app, start_disabled=True) # or
wdb_tornado(my_app, start_disabled=True)
そして、例外が発生したら、オン/オフボタンをクリックしてください。
リモートデバッグ
wdbでリモートデバッグを簡単に行うことができます:
コンピュータAでプログラムp.py
を実行したいのに、コンピュータBでそれをデバッグしたいとします。
コンピュータAでwdbサーバを起動し、これを起動します:
WDB_NO_BROWSER_AUTO_OPEN=True python -m wdb p.py
wdb logで指定されたURLにあるコンピュータBのブラウザを開きます。
これで、コンピュータCでwdbサーバーを実行し、コンピュータAで実行することもできます。
WDB_NO_BROWSER_AUTO_OPEN=True WDB_SOCKET_SERVER=computerC.addr WDB_SOCKET_PORT=19840 python -m wdb p.py
そしてコンピュータBをhttp:// computerC / debug / session / [uuid in log]に移動すると、コンピュータAで実行しているp.pyに入ることができます。
さまざまな構成を使用できます。
wdbインスタンスのサーバとこれらの環境変数のポートを変更する方法については、 wdb.server.py --help
を参照してください。
WDB_SOCKET_SERVER # WDB server host
WDB_SOCKET_PORT # WDB server socket port
WDB_WEB_SERVER # WDB server host for browser openning
WDB_WEB_PORT # WDB server http port
WDB_NO_BROWSER_AUTO_OPEN # To disable the automagic browser openning (which can't be done if the browser is not on the same machine)
ドッカー
Dockerを使用してローカルに開発する場合は、wdbを使用してコンテナ内で実行されるコードをデバッグすることもできます。 基本的な設定は次のようになります。
- コンテナ内で
wdb.server.py
起動し、ポート1984
をホストコンピュータに公開します。これにより、デバッグWebサーバーがサーバーになります。 - アプリケーションコンテナでデバッグを開始し、
WDB_SOCKET_SERVER
をサーバーコンテナのアドレスに設定し、そのサーバー上の19840
れたポート19840
をポイントするようにしてください。 - トレースに達すると、
http://<your-docker-hostname>:1984
開きhttp://<your-docker-hostname>:1984
Docker Composeを使用してコンテナを設定するこのプロセスを詳しく説明します。
あなたのdocker-compose.yml
がDjangoでの使用例に似ているとしましょう:
db:
image: postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
次に、今すぐwdbサーバーの部分を追加して、Webにリンクするように指示します。
db:
image: postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
- wdb
environment:
WDB_SOCKET_SERVER: wdb
WDB_NO_BROWSER_AUTO_OPEN: True
wdb:
image: kozea/wdb-server
ports:
- "1984:1984"
ウェブアプリケーションのrequirements.txt
にwdb
を追加します:
$ echo 'wdb' >> requirements.txt
これで、私たちのPythonアプリケーションでwdb.set_trace()
を使うことができます。
# ... some code
import wdb
wdb.set_trace()
次に、Webアプリケーションを再構築し、すべてを再開する必要があります
$ docker-compose stop
$ docker-compose build web
$ docker-compose up
これで、 http://<local docker server>:1984
にアクセスして、アプリケーション内でトレースが表示されるのを確認できます。
ブラウザの使用法
ブレークポイントまたは例外になったら、コードの下のプロンプトで必要なすべてを評価できます。 複数行は、 [Shift] + [Enter]
を使用して部分的にサポートされてい[Shift] + [Enter]
。 トップヘルプボタンをクリックするとヘルプが表示されます。
今のところ、以下の特別なコマンドがブレークポイント中にサポートされています:
* .s or [Ctrl] + [↓] or [F11] : Step into
* .n or [Ctrl] + [→] or [F10] : Step over (Next)
* .r or [Ctrl] + [↑] or [F9] : Step out (Return)
* .c or [Ctrl] + [←] or [F8] : Continue
* .u or [F7] : Until (Next over loops)
* .j lineno : Jump to lineno (Must be at bottom frame and in the same function)
* .b arg : Set a session breakpoint, see below for what arg can be*
* .t arg : Set a temporary breakpoint, arg follow the same syntax as .b
* .z arg : Delete existing breakpoint
* .l : List active breakpoints
* .f : Echo all typed commands in the current debugging session
* .d expression : Dump the result of expression in a table
* .w expression : Watch expression in current file (Click on the name to remove)
* .q : Quit
* .h : Get some help
* .e : Toggle file edition mode
* .g : Clear prompt
* .i [mime/type;]expression : Display the result in an embed, mime type is auto detected on linux and defaults to "text/html" otherwise
* iterable!sthg : If cutter is installed, executes cut(iterable).sthg
* expr >! file : Write the result of expr in file
* !< file : Eval the content of file
* [Enter] : Eval the current selected text in page, useful to eval code in the source
*
* * arg is using the following syntax:
* [file/module][:lineno][#function][,condition]
* which means:
* - [file] : Break if any line of `file` is executed
* - [file]:lineno : Break on `file` at `lineno`
* - [file][:lineno],condition : Break on `file` at `lineno` if `condition` is True (ie: i == 10)
* - [file]#function : Break when inside `function` function
*
* File is always current file by default and you can also specify a module like `logging.config`.
ソース内の変数を途中でクリックして評価することもできます。 行番号をクリックすると、ブレークポイントを追加/削除できます。
注:入力時に競合を避けるため、evalプロンプトで矢印のあるホットキーが意図的にトリガされません。
WDBサーバー
現在開いているデバッグセッションを確認するには、ブラウザをhttp:// localhost:1984 /で開きます。 クラッシュしたセッションを閉じることもできます。
そこから、すべてのpythonプロセスとそのスレッドが実行されていることを確認し、実行中に一時停止して、ステップバイステップのデバッグと現在の変数検査を実行することができます。 これは非常に実験的で、実行中のPythonプロセスにPythonコードを注入するために、gdbとptraceを有効にしたカーネルが必要です。 ptrace: Operation not permitted.
を取得した場合ptrace: Operation not permitted.
それを有効にする必要があります。
あなたのシステムに応じて、次のもので動作するかもしれません:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
プログラムを実行しているpythonバージョン用にwdbがインストールされていることを確認してください。
毎回wdbをインポートすることは疲れている
はい、それを避けるために、アプリケーションの先頭にw
組み込み関数を追加することができます:
from wdb.ext import add_w_builtin
add_w_builtin()
w
オブジェクトをコードのどこにでも使用できるようになりました:
my_code()
w.tf # Stop next line
doubtful_code()
my_code()
with w.trace():
doubtful_code()
コード補完
Wdbは、 jediのおかげで、evalプロンプトで動的コード補完を行います。
よくある質問
開かれたFirefoxではデバッグページは終了しません
これはFirefoxの設定フラグですabout:config
とset: dom.allow_scripts_to_close_windows
をtrue
設定してください
寄稿
すべての貢献は歓迎以上のもので、フォークルークを使用してください!
またはあなたはまだあなたのお金を使うことができます=)
テスト
Wdbは部分的にテストされているので、あなたが貢献したい場合は、必ずテストスイートを実行してください:
$ pip install pytest
$ pip install -e client -e server
$ cd test
$ py.test
お気軽にテストを追加してください!
著者
ライセンス
このライブラリはGPLv3でライセンスされています
wdb – WebSocketを介して起こりそうなWebデバッガ
wdb Copyright (c) 2012-2016 Florian Mounier, Kozea
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.