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.log2>是专门重定向文件描述符2(stderr)的语法,执行后所有strace的系统调用记录都会写入strace.log。 - 把strace日志和被追踪程序的所有输出合并存到同一个文件:将stderr合并到stdout后统一重定向
注意strace ls -l ./ > all_output.log 2>&12>&1必须写在stdout重定向的后面,才能保证两个流都写入同一个目标文件。 - 最推荐的无坑写法:用strace自带的
-o参数指定日志文件
这个参数是strace原生提供的日志输出配置,不需要记忆shell重定向的文件描述符规则,strace会直接把追踪日志写入你指定的文件,被追踪程序的stdout、stderr输出完全不受影响,不会出现流混淆的问题。strace -o strace.log ls -l ./
内容的提问来源于stack exchange,提问作者LinkedInPark
相关产品推荐
相关产品推荐

