You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链接阶段make报告'terminated'问题排查求助

问题描述

我正在开发一款自动化C++代码评分工具,用来编译并运行学生代码的测试用例。系统整体正常,但偶尔会在链接阶段失败,make输出如下:

clang++ -c main.cpp
clang++ -c foo.cpp
clang++ -c bar.cpp
clang++ main.o foo.o bar.o
make: *** [Makefile:10: all] Terminated

补充背景:

  • 用Python的subprocess模块调用make,工具基于Python开发
  • 运行环境是AWS EC2实例(Ubuntu 22.04,内存至少6GB)
  • 问题出现概率≤5%,待编译程序规模很小(总代码量通常<5k行,链接文件<10个)
  • 除了链接阶段,编译单个文件时也偶发该问题,重新运行评分工具就能解决

更新:make -d调试输出

编译阶段失败输出

...(successful builds above)...
Finished prerequisites of target file 'foo.o'.
  Must remake target 'foo.o'.
clang++ -g3 -Wall -Wextra -Wpedantic -Wshadow -O2 -c -o foo.o foo.cpp
Putting child 0x5597d3c65860 (foo.o) PID 67 on the chain.
Live child 0x5597d3c65860 (foo.o) PID 67 
Live child 0x5597d3c65860 (foo.o) PID 67 
Reaping losing child 0x5597d3c65860 PID 67 
make: *** [&lt;builtin&gt;: foo.o] Terminated
Removing child 0x5597d3c65860 PID 67 from chain

链接阶段失败输出

Must remake target 'prog'.
clang++ -g3 -Wall -Wextra -Wpedantic -Wshadow -o prog main.o foo.o bar.o baz.o foobar.o
Putting child 0x560a298357c0 (prog) PID 64 on the chain.
Live child 0x560a298357c0 (prog) PID 64 
make: *** Deleting file 'prog'
Live child 0x560a298357c0 (prog) PID 64 
Reaping losing child 0x560a298357c0 PID 64 
make: *** [Makefile:14: prog] Terminated
Removing child 0x560a298357c0 PID 64 from chain.
问题原因分析

从输出里的"Terminated"提示来看,这说明clang++进程是被外部信号终止的,不是自身崩溃或返回错误码。结合你的场景,主要可能的原因有这些:

  • OOM Killer进程终止:虽然EC2内存有6GB,但如果同时处理多个评分任务,可能出现瞬时内存不足。clang编译或链接时会占用一定内存,当系统内存紧张时,Linux的OOM Killer会主动终止占用内存较多的进程,刚好选中了clang。可以去系统日志/var/log/syslog或dmesg里搜索"Out of memory"或"Killed process"关键词,看看有没有对应PID的记录。

  • 信号误触发中断:Python的subprocess调用如果没处理好子进程的信号传递,或者评分工具里的超时、资源回收逻辑有漏洞,可能误发给clang++终止信号。检查下代码里的超时控制、进程回收逻辑,有没有可能出现误触发的情况。

  • 存储IO临时异常:AWS EC2的EBS卷偶尔可能出现IO延迟或临时错误,导致clang++读写文件时异常中断。不过这种情况概率较低,而且通常会有明确的IO错误提示,但也可以排查下EBS的监控指标,看是否有异常波动。

  • clang++偶发bug:虽然clang++整体稳定,但特定编译选项或代码场景下可能存在罕见bug导致进程崩溃。不过你重新运行就能成功,说明不是代码本身的问题,更偏向环境或资源因素。

验证建议
  1. 检查系统日志:运行dmesg | grep -i kill或grep -i oom /var/log/syslog,确认是否有OOM Killer的记录。
  2. 限制并发任务数:如果当前是多线程/多进程处理评分,减少并发量,看问题是否消失。
  3. 优化subprocess调用:确保subprocess的preexec_fn没有设置不当的信号处理,或者添加超时处理时避免误杀正常进程。
  4. 监控资源使用:在评分工具运行时,用top或htop监控内存、CPU使用情况,看是否有瞬时资源耗尽的情况。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:05:20