我在PyCharm中处理一个项目,我需要调试代码的某些部分。
当我尝试调试时,调试器只是"跳过"断点而不停在他们身边。 在网上进行了很多无用的尝试之后,我发现当我导入Scapy模块时,调试器不起作用,而且当Scapy没有导入时,一切都运行得很好。
顺便说一下 - 我正在使用Ubuntu OS。
任何想法??
答案 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_directoryName
,default_directoryName
,reasons_mapping
,cRL_reasons
,ext_mapping
,default_issuer
和default_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