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

在Bash循环中用Valgrind处理多C文件,如何忽略段错误?

问题:如何忽略段错误,让Bash循环继续处理所有文件?

我尝试在Bash循环中为多个可能触发段错误(segfault)的C文件生成Valgrind输出并保存到文件中,以下是编写的Bash代码:

while read p || [[ -n $p ]]; do 
    mkdir "$p"
    cd "$p"
    if ! cp -rL /class/cs2050/submissions/A/"$1"/"$p/" "$p" ; then
        echo "$p" >> $missing # 如果没有有效提交,将其添加到临时无效列表,之后可以查找(可能迟交了?)
        echo "未在截止窗口内提交实验"
    else
        cp $source_header "$p"
        cp $source_main "$p"
        compile "$p"/"$1"main.c  "$p"/"$1".c -o "main"
        touch valgrind.txt
        valgrind --log-file="valgrind.txt" ./main
    fi
    cd ..
done < "$file"

请问是否可以忽略每个程序的段错误,继续遍历处理所有文件?


解答

当然可以忽略段错误,让循环持续执行。核心逻辑是:Valgrind不会因为目标程序段错误而终止你的Bash循环——段错误只是./main的退出状态,Valgrind本身会正常退出,仅返回非零状态码。你的循环原本就会继续运行,若要彻底规避非零状态码可能带来的影响(比如开启了errexit模式),可以做以下调整:

  • 在valgrind命令末尾追加|| true,强制将该命令的退出状态设为0,确保后续循环不受干扰:
    valgrind --log-file="valgrind.txt" ./main || true
    

额外补充几个实用优化:

  • 给mkdir加上-p参数,避免目标目录已存在时报错:mkdir -p "$p"
  • 给$missing、$source_header、$source_main等变量加上双引号,防止路径包含空格时出现异常:echo "$p" >> "$missing"、cp "$source_header" "$p"
  • 如果compile命令存在失败可能,也可以追加|| true或添加错误处理,避免编译失败就跳过Valgrind步骤

调整后,无论目标程序是否触发段错误,Valgrind都会生成日志文件,循环也会继续处理下一个文件。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:12:43