Scapy模块阻止PyCharm调试器

时间:2016-11-20 11:25:00

标签: python ubuntu import pycharm scapy

我在PyCharm中处理一个项目,我需要调试代码的某些部分。

当我尝试调试时,调试器只是"跳过"断点而不停在他们身边。 在网上进行了很多无用的尝试之后,我发现当我导入Scapy模块时,调试器不起作用,而且当Scapy没有导入时,一切都运行得很好。

顺便说一下 - 我正在使用Ubuntu OS。

任何想法??

2 个答案:

答案 0 :(得分:5)

我自己遇到了这个问题。这很烦人。在很多调试之后,得到了答案。

问题的原因似乎是scapy将所有内容导入全局命名空间的方式,这似乎打破了PyCharm(名字冲突,也许?)。

顺便说一句,这一切都适用于2016年10月18日的scapy v2.3.3。

当scapy正在加载时,它最终会在scapy/all.py

中出现一行
from scapy.layers.all import *

这会加载加载scapy/layers/all.py的{​​{1}}。最后一个文件将scapy/config.py初始化为模块列表(在Conf.load_layers[]中)。

然后

scapy/layers遍历此列表,在每个模块上调用scapy/layers/all.py

加载_import_star()后,PyCharm中的所有断点都停止工作。

我为您提供四种解决方案,选择您最喜欢的解决方案......

(1)如果您不使用任何与X509有关的内容,您只需从scapy/layers/x509.py中分配给Conf.load_layers[]的列表中删除此模块(我的副本中的第383行) {1}})。警告:这是一个真正的黑客 - 请避免这样做,除非你没有其他方法。

如果您需要暂时调试,您也可以使用此代码示例:

scapy/config.py

(2)问题在于将符号导入全局命名空间。这对于类很好,对常量不好。 config.py中的代码检查符号的名称,如果它以from scapy import config config.Conf.load_layers.remove("x509") from scapy.all import * (即"私有"名称)开头,则不会将其加载到全局名称空间中。您可以通过忽略未开始_import_star()的名称来修改此函数以专门处理_模块。希望这将导入x509中定义的类而不是常量。这是一个示例补丁:

X509_

警告:这是一个真正的黑客 - 请避免这样做,除非你没有别的办法。

(3)这是解决方案(2)的变体,也是真正的HACK(等等)。您可以编辑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(): 。例如,scapy/layers/x509.py的所有实例都应更改为_。我找到了以下需要更改的常量:default_directoryName_default_directoryNamedefault_directoryNamereasons_mappingcRL_reasonsext_mappingdefault_issuerdefault_subject。这很好,因为它匹配我在scapy git repo中找到的应用于attrName_mapping的修复...

(4)您可以更新到下一版本的scapy。我不知道这是v2.3.4还是v2.4,因为(在撰写本文时)尚未发布下一个版本。因此,虽然这个(缺少新版本)仍在继续,但您可以更新到最新的开发版本(他们已经在2017年2月8日解决了这个问题)。我使用安装在我的主目录下的scapy(而不是在系统python包的位置),所以我做了以下内容:

attrName_specials
祝你好运!

答案 1 :(得分:0)

我不能评论Spiceisland的回应,因为缺乏声望点但是当前版本的scapy 2.3.3.dev532我可以看到与spiceisland使用x509指出的tls图层相同的问题。因此,必须相应地为tls模块应用所有变通方法和修复。

最简单的快速和脏修复(之后你将无法使用TLS):

在scapy / config.py中从load_layers列表中删除“tls”元素(这是scapy的2.3.3.dev532版本中的第434行)

我还为此问题提出了错误https://github.com/secdev/scapy/issues/746