web-dev-qa-db-ja.com

PyCharmでリモートデバッグを開始するにはどうすればよいですか?

PyCharm(windows Host)とdebian virtual Hostを実行しているDjangoアプリケーション。デバッグはEggをインストールし、インポートを追加してから呼び出すように指示します。これらのことをdebianホストで行う必要があると思いますか?

では、これらの2行をどのファイルに入れるべきでしょうか?

from pydev import pydevd
pydevd.settrace('not.local', port=21000, stdoutToServer=True, stderrToServer=True)

私はそれをsettings.pyに入れようとしましたが、この種のものを得ました...

File "/Django/conf/__init__.py", line 87, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
File "/Django/utils/importlib.py", line 35, in import_module
    __import__(name)
File "/settings.py", line 10, in <module>
    pydevd.settrace('dan.local', port=21000, stdoutToServer=True, stderrToServer=True)
File "/pycharm-debug.Egg/pydev/pydevd.py", line 1079, in settrace
    debugger.connect(Host, port)
File "/pycharm-debug.Egg/pydev/pydevd.py", line 241, in connect
    s = StartClient(Host, port)
File "/pycharm-debug.Egg/pydev/pydevd_comm.py", line 362, in StartClient
    sys.exit(1)
SystemExit: 1

Pycharmはただそこに座っていたが、「接続を待っている」

47
John Mee

PyCharm(または選択したide)は「サーバー」として機能し、アプリケーションは「クライアント」です。そのため、最初にサーバーを起動します-IDEに 'debug'を指示し、次にクライアントを実行します-これはsettraceステートメントを含むコードです。 pythonコードがsettraceにヒットすると、サーバー(pycharm)に接続し、デバッグデータの供給を開始します。

これを実現するには:

1。pydevライブラリをリモートマシンにコピー

そのため、ファイルをC:\Program Files\JetBrains\PyCharm 1.5.3\pycharm-debug.EggからLinuxマシンにコピーする必要がありました。 /home/john/api-dependancies/pycharm-debug.Eggに配置します

2。PYTHONPATHに卵を入れる

pythonが見つけられない限り、あなたはEggを使用できないことを感謝します。ほとんどの人がeasy_installを使用していると思いますが、私のインスタンスではこれを明示的に追加しました:

   import sys
   sys.path.append('/home/john/app-dependancies/pycharm-debug.Egg')

Eggのインストールがまだ成功していないため、これが必要なだけです。これが私の回避策です。

。デバッグサーバー設定のセットアップ

PyCharmでは、次の方法でデバッグサーバーを構成できます。

  • Run->Edit Configurations:「Run/Debug Configurations」を開きますダイアログ
  • Defaults-> "Python Remote Debug":は使用するテンプレートです
  • ローカルのホスト名とポートを入力すると、おそらく「パスマッピングを使用する」が必要になりますが、これについては以下で詳しく説明します...
  • "OK"

    ローカルホスト名serverの名前を意味します-私の場合はWindowsホストマシンです-または実際にはIPアドレスホスト名がリモートマシンに認識されていないため、Windowsホストマシンのそのため、仮想(リモート)マシンはホストに到達できる必要があります。 pingnetstatはこれに適しています。

    ポート:任意の空いている非特権ポートを使用できます。例:21000は使用されそうにありません。

    今のところパスマッピングについて心配する必要はありません。

4。デバッグサーバーの起動

  • Run->Debug:デバッグサーバーを起動-設定を選択作成しました。

デバッグコンソールタブが表示されます。

 Starting debug server at port 21000

これは、IDEデバッグサーバーがコードへの接続を開くのを待っていることを意味します。

5。コードを挿入

これは単体テスト内で機能します:

from Django.test import TestCase
class APITestCase(TestCase):
    def test_remote_debug(self):
        import sys
        sys.path.append('/home/john/dependancies/pycharm-debug.Egg')
        from pydev import pydevd
        pydevd.settrace('192.168.33.1', port=21000, suspend=False)

        print "foo"

そしてDjango Webアプリケーションでは、どこに置くかについて少し気難しいです-他のすべてが完了した後にのみ動作するようです:

if __== "__main__":
    os.environ.setdefault("Django_SETTINGS_MODULE", "settings")
    from Django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)

    sys.path.append('/vagrant/pycharm-debug.Egg')
    import pydevd
    pydevd.settrace('192.168.33.1', port=21000, suspend=False)

繰り返しますが、IPアドレスはPycharmを実行しているボックスです。コード/ウェブサイトを実行しているボックスからそのIPアドレスにpingできるはずです。ポートはあなたの選択です。同じポートでリッスンするようにpycharmに指示したことを確認してください。そして、suspend=Falseはデフォルトよりも問題が少なく、すぐに停止して動作するかどうかわからないだけでなく、悲しみを与えるかもしれないstdin/outにストリーミングしようとしていることがわかりました。

6。ファイアウォールを開く

Windows 7ファイアウォールは、デフォルトで着信接続をブロックします。リモートホストでnetstatを使用すると、少なくともアプリケーション「pycharm」のWindowsファイアウォールに例外を追加するまでは、SYN_SENTがESTABLISHEDにならないことがわかります。

OS/XとUbuntuには、パンチスルーを行うファイアウォールがありません(デフォルトでは、誰かが後でそれを適用した可能性があります)。

7。ブレークポイントを設定してコードを実行

その後、すべてが計画どおりになったら、ブレークポイントを設定できます-settraceが実行された後のどこかに-pycharmコンソールが表示されます

Connected to pydev debugger (build 107.386)

[デバッガ]タブで変数スタックが機能し始め、コードをステップ実行できます。

8。マッピング

マッピングは、pycharmにソースコードの場所を伝えます。デバッガーが「ファイル/foo/bar/nang.pyの393行目を実行しています」と言うと、Pycharmはそのリモート絶対パスを絶対ローカルパスに変換して、ソースコードを表示できます。

/Users/john/code/app/    /opt/bestprice/app/
/Users/john/code/master/lib    /opt/bestprice/lib/python2.7/site-packages

できた.

108
John Mee

実際には単なるメモですが、時間を節約できる情報が含まれています。

  1. たった今 pip install pydevd ubuntuとcentos 6の両方で私のために働いた
  2. Firewalsなどの背後にあるリモートサーバーを本当にデバッグしたい場合は、次のトリックを使用できます:

ssh -R 8081:localhost:8081 [email protected]

これにより、リモートコードがlocalhost:8081でリッスンしているマシンに接続できます。

  1. リモートデバッガーが開始しない場合、ソケットポートが見つからないと言って、ファイアウォールルールを確認します。 「127.0.0.1」のルールは「localhost」と同じではないことに注意してください。
9
Sergey

何らかの理由でデバッガがPyCharmでWindowsホストに接続できなかったようです。 stderrに他のメッセージはありませんか?まだ実行していない場合は、sterrToServer = falseでもう一度実行してください。それは接続しない本当の理由を示すかもしれません。

1
Dmitry Trofimov