GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

Kozea

wdb – WebSocketを介した可能性の低いWebデバッガ

投稿日:

WebSocketを介した可能性の低いWebデバッガ

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を使用してコンテナ内で実行されるコードをデバッグすることもできます。 基本的な設定は次のようになります。

  1. コンテナ内でwdb.server.py起動し、ポート1984をホストコンピュータに公開します。これにより、デバッグWebサーバーがサーバーになります。
  2. アプリケーションコンテナでデバッグを開始し、 WDB_SOCKET_SERVERをサーバーコンテナのアドレスに設定し、そのサーバー上の19840れたポート19840をポイントするようにしてください。
  3. トレースに達すると、 http://<your-docker-hostname>:1984開きhttp://<your-docker-hostname>:1984

Docker Composeを使用してコンテナを設定するこのプロセスを詳しく説明します。

あなたのdocker-compose.ymlDjangoでの使用例に似ているとしましょう:

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.txtwdbを追加します:

$ 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_windowstrue設定してください

寄稿

すべての貢献は歓迎以上のもので、フォークルークを使用してください!

またはあなたはまだあなたのお金を使うことができます=)

テスト

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/>.







-Kozea

執筆者: