Обход сообщений об ошибках libc, redirect из / dev / tty

Я пытаюсь поймать сообщения об ошибках, которые генерирует libc, когда он обнаруживает условия ошибки. Например, мой тестовый код:

#include  int main() { char* p = (char*)malloc(10); free(p); free(p); } 

Создает этот вывод

 $ ./main *** Error in `./main': double free or corruption (fasttop): 0x000000000124b010 *** ======= Backtrace: ========= /lib64/libc.so.6(+0x7d1fd)[0x7f8c121291fd] ./main[0x400b86] /lib64/libc.so.6(__libc_start_main+0xf5)[0x7f8c120cdaf5] ./main[0x400a79] ...  

Однако он не записывается в stderr или stdout, но / dev / tty (который я обнаружил с помощью strace)

 open("/dev/tty", O_RDWR|O_NOCTTY|O_NONBLOCK) = 3 writev(3, [{"*** Error in `", 14}, {"./main", 6}, {"': ", 3}, {"double free or corruption (fastt"..., 35}, {": 0x", 4}, {"00000000011bf010", 16}, {" ***\n", 5}], 7*** Error in `./main': double free or corruption (fasttop): 0x00000000011bf010 *** ) = 83 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0f2f7ac000 write(3, "======= Backtrace: =========\n", 29======= Backtrace: ========= ) = 29 writev(3, [{"/lib64/libc.so.6", 16}, {"(", 1}, {"+0x", 3}, {"7d1fd", 5}, {")", 1}, {"[0x", 3}, {"7f0f2ea2a1fd", 12}, {"]\n", 2}], 8/lib64/libc.so.6(+0x7d1fd)[0x7f0f2ea2a1fd] ) = 43 writev(3, [{"./main", 6}, {"[0x", 3}, {"400b86", 6}, {"]\n", 2}], 4./main[0x400b86] ) = 17 writev(3, [{"/lib64/libc.so.6", 16}, {"(", 1}, {"__libc_start_main", 17}, {"+0x", 3}, {"f5", 2}, {")", 1}, {"[0x", 3}, {"7f0f2e9ceaf5", 12}, {"]\n", 2}], 9/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f0f2e9ceaf5] ) = 57 writev(3, [{"./main", 6}, {"[0x", 3}, {"400a79", 6}, {"]\n", 2}], 4./main[0x400a79] ) = 17 

Как перенаправить это в файл? Стандартные перенаправления stdout и stderr не работают. Мне нужно поймать это для службы systemd, и прямо сейчас выход исчезает в эфир.

Я нашел UNDOCUMENTED (не в документации glibc!) Ответ , проверив исходный код libc, libc_fatal.c .

Задайте следующую переменную окружения:

 LIBC_FATAL_STDERR_=1 

чтобы libc записывал в stderr вместо /dev/tty .