STDERR中未捕获核心转储消息

时间:2015-10-26 07:14:47

标签: c++ linux bash

我以前用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)

那么,为什么我无法捕获"核心转储"我的日志中的消息?我该怎么办呢?

1 个答案:

答案 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