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

strace执行时shell重定向为何无法按预期写入文件?

原因说明

普通命令(比如示例里的echo)默认将正常输出写入标准输出流(stdout,对应文件描述符1),你用的>重定向符默认只捕获stdout的内容写入目标文件,所以echo的重定向可以正常生效。
strace属于系统调用追踪类调试工具,它的追踪日志默认是写入标准错误流(stderr,对应文件描述符2),而非stdout。你执行的strace ls -l ./ > out.txt命令中,>仅将进程的stdout(也就是被strace拉起的ls命令的目录列表输出)重定向到了out.txt,strace自身的追踪日志走stderr通道,默认还是打印在终端上,自然不会出现在out.txt里。
这种输出逻辑是strace刻意设计的:避免调试日志和被追踪程序的正常输出混杂,破坏程序原本的管道、重定向逻辑,同类调试工具(比如gdb、valgrind)也大多采用默认输出到stderr的逻辑。

正确重定向strace输出的方法

你可以根据自己的需求选下面任意一种写法:

  • 单独保存strace追踪日志,被追踪程序的输出正常显示在终端:直接重定向stderr即可
    strace ls -l ./ 2> strace.log
    
    这里2>是专门重定向文件描述符2(stderr)的语法,执行后所有strace的系统调用记录都会写入strace.log。
  • 把strace日志和被追踪程序的所有输出合并存到同一个文件:将stderr合并到stdout后统一重定向
    strace ls -l ./ > all_output.log 2>&1
    
    注意2>&1必须写在stdout重定向的后面,才能保证两个流都写入同一个目标文件。
  • 最推荐的无坑写法:用strace自带的-o参数指定日志文件
    strace -o strace.log ls -l ./
    
    这个参数是strace原生提供的日志输出配置,不需要记忆shell重定向的文件描述符规则,strace会直接把追踪日志写入你指定的文件,被追踪程序的stdout、stderr输出完全不受影响,不会出现流混淆的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:39:19