在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
相关产品推荐
相关产品推荐

