核心转储消息不会在STDERR中捕获

core dumped message is not captured in STDERR

本文关键字:STDERR 转储 消息 核心      更新时间:2023-10-16

我曾经用bash shell中的这一行调用我的程序来捕获日志文件

中的所有标准输出和标准错误消息
./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)

那么,为什么我不能在日志中捕获"core dumps"消息呢?我该怎么做呢?

这里有两个错误信息:

*** Error in `./a.out': free(): invalid pointer: 0x000000000169b268 ***

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

如果你想把它打印到stderr(无论stderr被重定向到哪里),你必须设置在启动程序之前,请先检查LIBC_FATAL_STDERR_。例如在bash中do:

export LIBC_FATAL_STDERR_=1

另一条消息

Aborted (core dumped)

它来自启动程序的shell,通过shell检查wait()的状态。如果程序不是由shell运行的,或者是由已经终止的shell运行的,那么您将无法捕获该消息。即使shell没有终止,该shell的错误也不会重定向到您的日志文件。

你可以这样做:

 { ./a.out input.txt ; } >log 2>&1

参见./a的重定向。Out未捕获分段错误)