STDERR中未捕获核心转储消息

Con*_*ent 4 c++ linux bash

我以前用bash shell中的这一行调用我的程序来捕获日志文件中的所有stdout和stderr消息

./a.out input.txt 2>&1 | tee log
Run Code Online (Sandbox Code Playgroud)

日志文件没有显示错误,但通过检查日志,很明显存在问题,程序在执行过程中突然终止.

我也尝试了这些,但结果是一样的:

./a.out input.txt > log 2>&1

./a.out input.txt |& tee log
Run Code Online (Sandbox Code Playgroud)

当我运行它而没有像这样的任何重定向:

./a.out input.txt
Run Code Online (Sandbox Code Playgroud)

我在终端窗口看到最后的错误消息:

*** Error in `./a.out': free(): invalid pointer: 0x000000000169b268 ***
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

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

nos*_*nos 5

这里有2条错误消息:

*** Error in `./a.out': free(): invalid pointer: 0x000000000169b268 ***
Run Code Online (Sandbox Code Playgroud)

它来自glibc,如果存在,则打印在当前tty上.

如果要将其打印到stderr(重定向stderr的任何位置),则必须LIBC_FATAL_STDERR_在启动程序之前进行设置.例如在bash中:

export LIBC_FATAL_STDERR_=1
Run Code Online (Sandbox Code Playgroud)

另一条消息

Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

这来自启动程序的shell,由shell检查wait()的状态.如果程序不是由shell运行,或者例如由已终止的shell运行,则您将无法捕获该消息.即使shell没有终止,该shell的stderr也不会重定向到您的日志文件.

您可以通过以下方式解决这个问题:

 { ./a.out input.txt ; } >log 2>&1
Run Code Online (Sandbox Code Playgroud)

另请参见重定向./a.out不捕获分段错误)