Scapy模块块PyCharm调试器
我在PyCharm中的一个项目上工作,我需要调试代码的某些部分。Scapy模块块PyCharm调试器
当我尝试调试时,调试器只是“跳过”了断点而没有停止它们。 在网络中进行了很多无用的尝试之后,我发现当我导入Scapy模块时,调试器不起作用,并且当Scapy未导入时,所有内容都可以正常工作。
Btw - 我在Ubuntu操作系统上工作。
任何想法??
自己碰到这个问题。这是非常烦人的。 多调试后,得到了答案。
问题的原因似乎是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_directoryName
,reasons_mapping
,cRL_reasons
,ext_mapping
,default_issuer
,default_subject
,attrName_mapping
和attrName_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://*.com/help/whats-reputation),你将可以[对任何帖子发表评论](https://*.com/help/privileges/comment);相反,[提供不需要提问者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- I-DO-代替)。 - [来自评论](/ review/low-quality-posts/16895402) – mbelsky
感谢您的评论,我更新了我的答案,直接解决方案,不需要澄清。 –
你试试这个:http://*.com/questions/21788939/how-to-use-pycharm- to-debug-scrapy-projects –
我可以继续这种行为。幸运的是,我不需要在此模块周围进行很多调试 – portforwardpodcast