我们在应用中使用嵌入式cpython作为脚本语言。我们在启动时修改我们的sys.path以确保我们不从我们的应用程序外部执行代码,但是在PYTHONPATH中使用sitecustomize.py的用户导致代码在我们有机会修复sys之前执行.path,我们相信他们的代码有一个严重的崩溃(不是例外,site.py将优雅地捕获和处理)。
我认为正确的解决方法是在初始化python之前简单地从环境中清除PYTHONPATH变量,但我无法正确测试它,因为我无法重新创建问题。
我发现最简单的方法是使用ctypes写入内存,例如:
public ActionResult GroupRights(PermissionsVM model)
但是在Python 3.5中,它不允许我写入c_char类型,给出错误" TypeError:' c_char'对象不支持项目分配" 。
我已尝试https://wiki.python.org/moin/CrashingPython中提供的一些方法无济于事。
有没有一种可靠的方法可以从纯Python代码中崩溃python 3.5?
答案 0 :(得分:2)
ctypes
有很多方法。例如,代码的更正版本:
p = ctypes.pointer(ctypes.c_char.from_address(5))
p[0] = b'x'
如果您不想使用ctypes,可能会在dict.__repr__
实现中触发C堆栈溢出:
x = {}
for i in range(1000000):
x = {1: x}
repr(x)
这可能会在未来的Python版本中得到补丁,但就目前而言,它应该会产生严重的崩溃。
还有一些方法可以通过构建自己的字节码对象来实现,因为Python几乎不会确保它执行的字节码有意义。
答案 1 :(得分:2)
只需在要触发崩溃的代码行上添加0/0。您将收到一个ZeroDivisionError
我认为这是强制崩溃的最简单方法
答案 2 :(得分:1)
答案 3 :(得分:0)
我通常只使用Python 2.7,但我相信只要我正确理解你的问题,这仍然适用。如果你想强行退出Python程序,那么我所知道的最简单的方法就是提出一个SystemExit。这是一个相当简单的例子:
for i in range (0, 10):
if (i == 6): #Stop the program at 6 just.. because
raise SystemExit
print(i)
我希望这有用!
快乐的编码!
答案 4 :(得分:0)
这是使python崩溃的一种简单方法:
def crash():
try:
crash()
except:
crash()
crash()
答案 5 :(得分:0)
您可以使用休闲:
exec(type((lambda: 0).__code__)(0, 0, 0, 0, 0, 0, b'\x053', (), (), (), '', '', 0, b''))
这将创建字节码,该字节码启动一个finally
语句,该语句永不结束,从而使解释程序崩溃。