どのようにPDBはソースが実行の間変更されたことを認識させるには?

StackOverflow https://stackoverflow.com/questions/724924

  •  05-09-2019
  •  | 
  •  

質問

ソースコードは、「実行」の間で変更されたときに

私が言うことができるものから、PDBが認識されません。それは私がデバッグだ場合、ある、バグに気づく、そのバグの修正、および(PDBを終了せず、すなわち)PDBにプログラムを再実行し、PDBは、コードを再コンパイルしません。私はまだPDBは新しいソースコードをリストしていても、コードの古いバージョンをデバッグすることがあります。

だから、PDBは、ソースの変更としてコンパイルされたコードを更新しないのですか?そうでない場合、それはそうようにする方法はありますか?私は私のブレークポイントと、そのようなを維持するために、単一のPDBのセッションに滞在できるようにしたいと思います。

FWIWのみ、そのプログラムの再起動時にかかわらず、プログラムは、その下の変更をデバッグだとき、GDBがわかります。これは私がPDBに複製しようとしている動作です。

役に立ちましたか?

解決

あなたは何を意味するのです「PDBにプログラムを再実行します?」あなたはモジュールをインポートした場合は、明示的、すなわちreload(module)で、そうすることをお願いしていない限り、Pythonはそれを再読み込みしません。しかし、reloadは( xreload の別のための参照防弾から遠いです戦略)。

Pythonコードのリロード中に落とし穴がたくさんあります。より堅牢あなたの問題を解決するには、例えば、ディスク上のファイルへのブレークポイントの情報を、記録し、コマンドでそれらを再生クラスでPDBを包むことができます。

(申し訳ありませんが、この回答の最初のバージョンを無視する。それは早いですし、私は慎重に十分にあなたの質問を読んでいない)

他のヒント

以下のミニモジュールは役立つかもしれません。あなたはPDBのセッションでそれをインポートする場合は、使用することができます:

pdb> pdbs.r()

いつでもする強制リロードすべての非システム・モジュールのの主除きます。コードはスキップそれははImportErrorをスローするので(「再初期化することはできません内部モジュールのの」)ことを除きます。

# pdbs.py - PDB support

from __future__ import print_function

def r():
    """Reload all non-system modules, so a pdb restart
    will reload anything new
    """
    import sys
    # This is likely to be OS-specific
    SYS_PREFIX = '/usr/lib'

    for k, v in sys.modules.items():
        if not hasattr(v, '__file__'):
            continue
        if v.__file__.startswith(SYS_PREFIX):
            continue
        if k == '__main__':
            continue
        print('reloading %s [%s]' % (k, v.__file__))
        reload(v)

%autoreload拡張子ipdbの

6.2.0ドキュメントのドキュメント http://ipython.readthedocs.io/en/stable/config/extensions/autoreload.html#module-IPython.extensions.autoreloadするます:

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: from foo import some_function

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: some_function()
Out[6]: 43
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top