我以前用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)
那么,为什么我无法捕获"核心转储"我的日志中的消息?我该怎么办呢?
答案 0 :(得分:5)
这里有2条错误消息:
*** Error in `./a.out': free(): invalid pointer: 0x000000000169b268 ***
这来自glibc,并且打印在当前tty上(如果存在)。
如果要将其打印到stderr(重定向stderr的地方),则必须设置
在启动程序之前LIBC_FATAL_STDERR_
。
例如在bash做:
export LIBC_FATAL_STDERR_=1
另一条消息
Aborted (core dumped)
这来自启动程序的shell,由shell检查wait()的状态。 如果程序不是由shell运行,或者例如由已终止的shell运行,您将无法捕获该消息。即使shell没有终止,该shell的stderr也不会被重定向到你的日志文件。
您可以通过以下方式解决这个问题:
{ ./a.out input.txt ; } >log 2>&1
另见redirection of ./a.out is not capturing segmentation fault)