2016-11-20 48 views
2

我在PyCharm中的一個項目上工作,我需要調試代碼的某些部分。Scapy模塊塊PyCharm調試器

當我嘗試調試時,調試器只是「跳過」了斷點而沒有停止它們。 在網絡中進行了很多無用的嘗試之後,我發現當我導入Scapy模塊時,調試器不起作用,並且當Scapy未導入時,所有內容都可以正常工作。

Btw - 我在Ubuntu操作系統上工作。

任何想法??

+0

你試試這個:http://stackoverflow.com/questions/21788939/how-to-use-pycharm- to-debug-scrapy-projects –

+0

我可以繼續這種行爲。幸運的是,我不需要在此模塊周圍進行很多調試 – portforwardpodcast

回答

3

自己碰到這個問題。這是非常煩人的。 調試後,得到了答案。

問題的原因似乎是scapy將所有東西導入到全局命名空間的方式,這似乎打破了PyCharm(名稱衝突,也許?)。

順便說一句,這一切都適用於從10月18日Scapy的的v2.3.3,2016年

由於Scapy的加載時,其最終在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中的所有斷點停止工作。

我已經給你四種解決方案,挑選你最喜歡的一個...

(1)如果你不使用任何與X509做,你可以簡單地刪除分配列表此模塊到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(): 

警告:這是一個真正HACK - 請避免這樣做,除非有你前進別無他法。 (3)這是解決方案(2)的變體,所以還有REAL HACK(等等)。您可以編輯scapy/layers/x509.py並在所有常量前加上_。例如,default_directoryName的所有實例都應更改爲_default_directoryName。我發現需要改變的以下常量:default_directoryNamereasons_mappingcRL_reasons,ext_mapping,default_issuer,default_subject,attrName_mappingattrName_specials。這很好,因爲它匹配修復應用於x509.py,我發現在scapy git回購...

(4)您可以只更新到scapy的下一個版本。我不知道這是否是v2.3.4或v2.4,因爲(在撰寫本文時)還沒有發佈下一個版本。所以,雖然這個(缺乏新版本)仍然存在,但您可以更新到最新的開發版本(2017年2月8日,他們已經解決了這個問題)。我使用scapy安裝在我的主目錄下(而不是在系統python軟件包位置),所以我做了以下操作:

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模塊。

那麼簡單快速和骯髒的修復(你將不能夠以後使用TLS):

在Scapy的/ config.py刪除load_layers列表「TLS」元素(這是行434在2.3 .3.dev532版本Scapy的的)

我也提交了錯誤此問題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-代替)。 - [來自評論](/ review/low-quality-posts/16895402) – mbelsky

+0

感謝您的評論,我更新了我的答案,直接解決方案,不需要澄清。 –