web-dev-qa-db-ja.com

デバッガーが「データの収集...」でタイムアウトします。

私はPython(3.5)PyCharmを使用したプログラム(PyCharm Community Edition 2016.2.2 ; Build #PC-162.1812.1, built on August 16, 2016 ; JRE: 1.8.0_76-release-b216 x86 ; JVM: OpenJDK Server VM by JetBrains s.r.o)Windows10の場合。

問題:いくつかのブレークポイントで停止すると、デバッガウィンドウが「データの収集」でスタックし、最終的にタイムアウトします。(withフレーム変数を表示できません

表示されるデータは特別なものでも、特に大きなものでもありません。上記のデータのいくつかの値の条件付きブレークポイントが正常に機能するため(プログラムがブレークする)、PyCharmで何らかの形で利用できます操作目的ではなく)表示のみのためにデータを収集するプロセスが失敗するようです。

ブレークポイントがある場所の周りの関数にステップインすると、そのデータが正しく表示されます。スタックを上に行くと(呼び出し元の関数、最初にブレークポイントを設定したい場所)-「データの収集」タイムアウトが再び発生します。

少なくとも2005年以来、同じ点で多くの問題が提起されています。修正されたものもあれば、修正されていないものもあります。修正は通常、最新バージョン(私が持っている)へのアップデートでした。

---(この一連の問題を修正または回避するために進むことができる一般的な方向性はありますか?


編集:1年後、問題はまだ存在しており、バグが発生した後も開発者/サポートからの反応はありません。


2018年4月編集:問題は2018.1バージョンで解決されたようですprint行にブレークポイントを設定するときにハングしていた次のコードが機能するようになりました(変数を確認できます) )::

import threading

def worker():
    a = 3
    print('hello')

threading.Thread(target=worker).start()
18
WoJ

これは、デフォルトのメソッド__str __()が冗長すぎるクラスがあることが原因だと思います。 Pycharmはこのメソッドを呼び出して、ブレークポイントに到達したときにローカル変数を表示し、文字列のロード中にスタックします。これを克服するために使用するトリックは、エラーの原因となっているクラスを手動で編集し、冗長性の低いものを__str __()メソッドに置き換えることです。

例として、これはpytorch _TensorBaseクラス(およびそれを拡張するすべてのテンソルクラス)で発生し、pytorchソースtorch/tensor.pyを編集し、__ str __()メソッドを次のように変更することで解決できます。

def __str__(self):
        # All strings are unicode in Python 3, while we have to encode unicode
        # strings in Python2. If we can't, let python decide the best
        # characters to replace unicode characters with.
        return str() + ' Use .numpy() to print'
        #if sys.version_info > (3,):
        #    return _tensor_str._str(self)
        #else:
        #    if hasattr(sys.stdout, 'encoding'):
        #        return _tensor_str._str(self).encode(
        #            sys.stdout.encoding or 'UTF-8', 'replace')
        #    else:
        #        return _tensor_str._str(self).encode('UTF-8', 'replace')

最適とはほど遠いですが、手元にあります。

更新:少なくとも私に影響を与えていたケースでは、エラーは最後のPyCharmバージョン(2018.1)で解決されたようです。

4
Manel B

Pycharm2018.2を使用してWebアプリケーションをデバッグするときに、同じ質問がありました。

このプロジェクトは、SocketIOと組み合わせた複雑なflask Webサーバーです。

コード内にデバッグブレークポイントを作成してからデバッグボタンを押すと、ブレークポイントで停止しましたが、変数が読み込まれませんでした。データデータを収集しただけです。最後にデバッガーの設定を微調整しましたが、これで機能しました。変更する設定については、次の画像を参照してください。

Image

38
linkliu mayuyu

PyTorch(または他のディープラーニングライブラリ)を使用しているためにここに着陸し、PyCharm(torch 1.31、PyCharm)でデバッグを試みた場合私の場合は2019.2)ですが、非常に遅いです:

有効にするGevent compatible の中に Python Debugger設定linkliu mayuyuが指摘しました。この問題は、大規模な深層学習モデル(私の場合はBERTトランスフォーマー)のデバッグが原因で発生する可能性がありますが、これについては完全にはわかりません。

2019年の終わりであり、これはまだ修正されていないようですので、この回答を追加します。さらに、これはディープラーニングを使用する多くのエンジニアに影響を与えていると思うので、私の回答フォーマットがスタックオーバーフローアルゴリズムをトリガーすることを願っています:-)

4
u_b

SympyとPythonモジュール 'Lea'を使用して確率分布を計算することを目的としたコードで作業していたときにもこの問題が発生しました。

タイムアウトの問題を解決するために私が行ったアクションは、デバッグ設定の「変数の読み込みポリシー」をデフォルトの「非同期」から「同期」に変更することでした。

Debug Variables Loading Policy setting

2
Tony P

PyTorch(PyCharm 2019.3)によって記述されたいくつかのディープラーニングスクリプトを実行しようとしたときに、同じ問題が発生しました。

私はついに、問題はDataLoadernum_workersを大きな値(私の場合は20)に設定することであることがわかりました。

したがって、デバッグモードでは、num_workers1に設定することをお勧めします。

0
Flamingo