Scapy模块块PyCharm调试器

问题描述:

我在PyCharm中的一个项目上工作,我需要调试代码的某些部分。Scapy模块块PyCharm调试器

当我尝试调试时,调试器只是“跳过”了断点而没有停止它们。 在网络中进行了很多无用的尝试之后,我发现当我导入Scapy模块时,调试器不起作用,并且当Scapy未导入时,所有内容都可以正常工作。

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

任何想法??

+0

你试试这个:http://*.com/questions/21788939/how-to-use-pycharm- to-debug-scrapy-projects –

+0

我可以继续这种行为。幸运的是,我不需要在此模块周围进行很多调试 – portforwardpodcast

自己碰到这个问题。这是非常烦人的。 调试后,得到了答案。

问题的原因似乎是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 

祝你好运!

我不能评论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://*.com/help/whats-reputation),你将可以[对任何帖子发表评论](https://*.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

感谢您的评论,我更新了我的答案,直接解决方案,不需要澄清。 –