どのようにPDBはソースが実行の間変更されたことを認識させるには?
質問
私が言うことができるものから、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