奇怪的是,在调试模式下,如果脚本在通常会发生段错误(没有断点)的地方停止(通过断点),然后恢复,则不会发生段错误。很奇怪吧?
本项目使用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 开发新手。即使您没有完整的答案,任何帮助/提示将不胜感激。
也为我工作! 非常感谢@FrankLarry
对于那些没有找到它的人:
Pycharm 首选项 -> Python 调试器 -> 收集运行时类型...
勾选此选项即可。
在我的例子中,SIGSEGV 是由于无限递归调用
__getattr__
方法而导致的堆栈溢出。该调用是由数据窗口发起的(它试图在到达断点时显示变量值)。
但是调用堆栈和异常消息没有打印到调试窗口(因为它不是由我的python应用程序引起的,而是由PyCharm引起的),因此很难找到真正的原因。
它帮助我在调试窗口设置中将“变量加载策略”切换为“按需”值。