【发布时间】:2015-10-26 07:14:46
【问题描述】:
我曾经在 bash shell 中使用这一行调用我的程序,以捕获日志文件中的所有 stdout 和 stderr 消息
./a.out input.txt 2>&1 | tee log
日志文件没有显示错误,但是通过检查日志,很明显有问题,程序在执行过程中突然终止。
我也试过这些,但结果是一样的:
./a.out input.txt > log 2>&1
./a.out input.txt |& tee log
当我在没有任何重定向的情况下运行它时:
./a.out input.txt
我在终端窗口最后看到错误消息:
*** Error in `./a.out': free(): invalid pointer: 0x000000000169b268 ***
Aborted (core dumped)
那么,为什么我无法在日志中捕获“核心转储”消息?我该怎么做?
【问题讨论】:
-
某些程序仅在连接到 tty(文本终端,您可以将其解释为交互式 shell)时将某些消息打印到 stderr。当 stderr 连接到管道时,这些消息可能会被抑制。
-
我的猜测是,在重定向输出的程序崩溃后,您的 shell 正在打印“x 中的错误:free()”等消息。您可以尝试在子 shell 中运行该进程:
$( ./a.out ) > log > 2>&1- 我会尝试但手边没有 Linux 机器。 -
我写了这个程序,不管它是否连接到tty,我都没有做任何特别的事情。这是我编写的一个简单程序,用于使用动态数组进行递归合并排序并删除它们。我在 ubuntu 中用 g++ 编译。
-
你不需要做任何特别的事情;它可能是编译器。
-
你可以用一个伪 tty 试试这个,看看你是否收到消息。