我以前用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)
那么,为什么我无法在日志中捕获"核心转储"消息?我该怎么做?
这里有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不捕获分段错误)
| 归档时间: |
|
| 查看次数: |
777 次 |
| 最近记录: |