Python/PyCharm项目在调试模式下会产生分段错误,但在运行模式下不会。

18

奇怪的是,在调试模式下,如果脚本停止(通过断点),在没有断点的情况下通常会发生的段错误就不会发生了。非常奇怪,对吧?

这个项目使用PyCharm和Pygame。操作系统是Windows 10。该项目包含8个模块、大约1500行代码,调试一直很顺利,直到现在。

运行脚本时(非调试模式),不会出现分段错误。以下是终端在出现分段错误时的输出:

Fatal Python error: pygame_parachute: (pygame parachute) Segmentation Fault
Python runtime state: initialized

#some other threads here
Thread 0x0000490c (most recent call first):
... a long stack trace
Thread 0x00002c98 (most recent call first):
... a long stack trace
Thread 0x000048ec (most recent call first):
... a long stack trace

Current thread 0x000020d0 (most recent call first):
  File "C:\Users\Solaire\PycharmProjects\Game2\ai.py", line 60 in do_ai
  **File "C:/Users/Solaire/PycharmProjects/Game2/main.py", line 45 in <module>**
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2021.2.2\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18 in execfile
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2021.2.2\plugins\python-ce\helpers\pydev\pydevd.py", line 1483 in _exec
Extension modules:
 ...lots of extensions...

Process finished with exit code -1073740791 (0xC0000409)

我能立刻想到的唯一一件事就是在模块main.py中使用正斜杠。下面的堆栈帧似乎考虑文件名:
    #execute the script (note: it's important to compile first to have the filename set in debug mode)
    exec(compile(contents+"\n", file, 'exec'), glob, loc)

调试器的文件名是否错误?这是我得到的唯一提示。我是Python开发的新手。即使您没有完整的答案,任何帮助/提示都将不胜感激。


19
仅凭运气,我通过更改Python调试器中的一个设置,成功避免了这个段错误。我勾选了“收集代码洞察的运行时类型信息”的框。勾选此框后,至今还没有发生段错误,而取消勾选则会导致调试器崩溃。但为什么会这样呢? - Frank Larry
如果可能的话,请将项目代码发送给PyCharm支持团队,邮箱为pycharm-support@jetbrains.com。很遗憾,没有代码很难确定问题所在。总的来说,调试运行 != 纯运行。调试器使用CPython API与Python进程进行交互 - 可能存在问题或调试器本身存在漏洞。 - Pavel Karateev
1
天啊...我和你的情况一模一样!!我使用的是macOS catalina 10.15.7,python 3.10.4,Pycharm 2022.1 (PY-221.5080.212),只有在调试时才会崩溃。我尝试了“收集代码洞察力的运行时类型信息”,它起作用了!!你救了我的命,非常感谢!(我已经多次重新安装了Python和Pycharm,但都没有效果 :( ) - Jerry
1
正如你在评论中提到的,勾选“为代码洞察收集运行时类型信息”对我来说起作用了。 - theredcomet
1
Frank的评论解决了我的问题。@FrankLarry,你应该把它作为答案发布,这样可以获得更多关注。 - Fiver
显示剩余2条评论
4个回答

17

对我也起作用了! 非常感谢@FrankLarry

对于那些没有找到的人:

Pycharm首选项 -> Python调试器 -> 收集运行时类型...

只需勾选此选项。


谢谢修正!我还需要点击“清除缓存”才能让它工作。 - M. Ka

1

0
其他答案在这里对我们没有用,但是下面的方法有效。正如@gman3g建议的那样,这篇文章中有一个解决方案:

将PYDEVD_USE_CYTHON=NO环境变量添加到运行配置中解决了这个问题。


0
在我的情况下,SIGSEGV 是由于无限递归调用 __getattr__ 方法导致的堆栈溢出。这个调用是由数据窗口发起的(当断点被触发时,它试图显示变量值)。
但是,调用堆栈和异常消息没有被打印到调试窗口中(因为它不是由我的 Python 应用程序引起的,而是由 PyCharm 引起的),所以很难找到真正的原因。
在调试窗口设置中将“变量加载策略”切换为“按需”值对我有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接