2016-11-20 8 views
2

私はPyCharmのプロジェクトで作業しており、コードの特定の部分をデバッグする必要があります。ScapyモジュールブロックPyCharmデバッガー

デバッグしようとすると、デバッガはブレークポイントを停止せずに単に「スキップ」しました。 ウェブで役に立たない試しが多かったので、私はScapyモジュールをインポートするとデバッガが動作せず、Scapyがインポートされていないときはすべて正常に動作することがわかりました。

Btw - 私はUbuntu OSで作業しています。

+0

あなたはこれを試していました。この問題のためにバグを提出していますhttp://stackoverflow.com/questions/21788939/how-to-use-pycharm- –

+0

私はこの動作を2番目にすることができます。幸運にも、私はこのモジュールのまわりで多くデバッグする必要はありません – portforwardpodcast

答えて

3

自分自身でこの問題に遭遇しました。それは非常に迷惑です。 多くの場合のデバッグの後、答えになった。

scapyがすべてをグローバル名前空間にインポートする方法のようですが、これはPyCharm(名前の衝突、たぶん?)を破るようです。ところで

、これはscapyがロードされると、すべてが、10月18日からscapyのv2.3.3に2016年

を適用し、それが最終的にscapy/all.pyで行を打つ:

from scapy.layers.all import * 

これはscapy/layers/all.pyをロード負荷はscapy/config.pyです。この最後のファイルは、Conf.load_layers[]をモジュールリスト(scapy/layers)に初期化します。

scapy/layers/all.pyこのリストをループし、各モジュールに_import_star()を呼び出します。

scapy/layers/x509.pyがロードされた後、PyCharmのすべてのブレークポイントが機能しなくなります。

私はあなたがX509を行うには何も使用しない場合は(1)、あなたは、単に割り当てられたリストからこのモジュールを削除することができ、あなたのためFOURソリューションをした、あなたが一番好きなものを選択...

Conf.load_layers[]scapy/config.py(私のコピーconfig.pyの383行)。警告:これは本当のハックです - あなたのための他の方法がない限り、やめてください。

あなたは一時的にデバッグする必要がある場合は、このサンプルコードを使用することができます。

from scapy import config 
config.Conf.load_layers.remove("x509") 
from scapy.all import * 

(2)の問題は、シンボルがグローバル名前空間にインポートされた状態です。これはクラスにとっては問題ありませんが、定数には悪いです。 _import_star()にはシンボルの名前をチェックするコードがあり、_(つまり「プライベート」の名前)で始まる場合はシンボルをグローバル名前空間にロードしません。この関数を変更して、x509モジュールを特別に扱うには、X509_という名前で始まらない名前を無視します。うまくいけば、これはx509で定義されたクラスをインポートし、定数はインポートしません。ここではサンプルパッチです:

*** layers/all.py 2017-03-31 12:44:00.673248054 +0100 
--- layers/all.py 2017-03-31 12:44:00.673248054 +0100 
*************** 
*** 21,26 **** 
--- 21,32 ---- 
      for name in mod.__dict__['__all__']: 
       __all__.append(name) 
       globals()[name] = mod.__dict__[name] 
+  elif m == "x509": 
+   # import but rename as we go ... 
+   for name, sym in mod.__dict__.iteritems(): 
+    if name[0] != '_' and name[:5] != "X509_": 
+     __all__.append("_x509_" + name) 
+     globals()["_x509_" + name] = sym 
     else: 
      # import all the non-private symbols 
      for name, sym in mod.__dict__.iteritems(): 

警告:これはREALハックです - あなたのための前方他の方法がない場合を除き、それをやって避けてください。

(3)これはソリューション(2)のバリエーションであり、REAL HACK(など)も同様です。 scapy/layers/x509.pyを編集し、すべての定数の前に_を追加することができます。たとえば、default_directoryNameのすべてのインスタンスを_default_directoryNameに変更する必要があります。変更が必要な以下の定数が見つかりました:default_directoryNamereasons_mappingcRL_reasonsext_mappingdefault_issuerdefault_subjectattrName_mappingおよびattrName_specialsこれは、私がscapy git repoで見つけたx509.pyに適用された修正と一致するので、いいです...

(4)次のバージョンのscapyに更新するだけです。私はこれがv2.3.4かv2.4になるかどうかはわかりませんが、(まだ書いている時点で)次のバージョンはまだリリースされていません。したがって、このリリース(新しいリリースの欠如)は続行されますが、最新の開発バージョン(2017年2月8日にこの問題を既に解決しています)に更新することができます。私は(むしろ、システムのPythonパッケージの場所に比べて)私のホームディレクトリの下にインストールscapyを使用するので、私は次のようでした:

pip uninstall scapy 
git clone https://github.com/secdev/scapy /tmp/scapy 
cd /tmp/scapy 
python setup.py install --user 
cd - 
rm -rf /tmp/scapy 

幸運!

0

評判ポイントの不足のためにSpiceislandの回答にコメントすることはできませんが、現在のバージョンのscapy 2.3.3.dev532では、Spiceislandがx509で指摘したtlsレイヤーと同じ問題が発生します。したがって、すべての回避策および修正は、tlsモジュールに応じて適用する必要があります。 load_layersリストからscapy/config.py削除「TLS」要素で

(つまり、2.3でライン434です:

ので、最も簡単迅速かつ汚い修正(とあなたがそれ以降TLSを使用することはできません) scapyの.3.dev532版)

は私もhttps://github.com/secdev/scapy/issues/746

+0

これは質問への答えを提供しません。十分な[評判](https://stackoverflow.com/help/whats-reputation)があれば、[投稿にコメントする]ことができます(https://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューの投稿](レビュー/低品質の投稿/ 16895402) – mbelsky

+0

ご意見ありがとうございます。私は解決策を明確にする必要がない簡単な解決策で更新しました。 –