GitHub Action中pytest执行完成后出现Segmentation fault问题排查
我配置了一个GitHub Action,流程为:拉取QGIS的Docker镜像 → 安装依赖 → 运行pytest。该流程在本地运行正常,但在GitHub Action中执行时出现如下报错:
======================== 4 passed, 2 warnings in 5.04s =========================
Segmentation fault (core dumped)
Error: Process completed with exit code 139
我有两个配置相似的项目:一个运行正常,另一个运行失败,请问可能是什么原因导致该错误?
可能的原因及排查方向
1. QGIS Docker镜像版本不一致
段错误常与底层库版本冲突相关。检查两个项目的GitHub Action配置,确认使用的QGIS镜像标签是否完全一致(比如是否一个用了qgis/qgis:3.34.14,另一个用了latest浮动标签)。浮动标签可能随时间更新镜像内容,引入兼容性问题。
2. 依赖包版本冲突
对比两个项目的依赖声明文件(如requirements.txt),找出版本不同的包,尤其是与QGIS交互的核心依赖(如gdal、pyproj、qgis相关库)。部分高版本Python库可能与QGIS内置的C++底层库存在兼容性问题,导致测试完成后触发段错误。
3. GitHub Action运行资源不足
GitHub Action默认运行器的内存、CPU资源比本地环境更有限。若失败项目的测试用例未正确释放QGIS资源(比如未关闭QgsApplication实例、未清理内存中的图层对象),可能导致内存耗尽触发段错误。可以尝试在测试代码末尾添加资源清理逻辑,或在Action中配置更高规格的运行器。
4. 测试用例收尾逻辑缺失
检查失败项目的测试代码,确认是否在所有测试完成后显式退出QGIS应用。比如是否调用了QgsApplication.exit(),是否清理了所有QGIS相关对象。本地环境资源充足可能掩盖资源未释放的问题,但在受限的GitHub Action环境中会触发段错误。
5. Docker镜像底层系统库差异
即使是同一标签的QGIS镜像,不同时间拉取可能包含更新后的系统库(如glibc、libstdc++)。这些底层库的变动可能导致QGIS运行时出现段错误。可以尝试在Action中固定镜像的具体哈希值(而非标签),确保两个项目使用完全一致的镜像文件。
6. pytest运行参数/插件差异
对比两个项目的pytest执行命令,检查是否存在参数或插件差异。比如失败项目是否启用了pytest-xdist等并行测试插件,或使用了某些可能干扰QGIS运行的参数,这些都可能触发段错误。逐步移除差异项测试,定位问题根源。
内容的提问来源于stack exchange,提问作者axel_ande

