Catching libc error messages, redirecting from /dev/tty

萝らか妹 提交于 2019-12-18 05:54:54

问题


I am trying to catch error messages that libc generates when it detects error conditions. For example, my test code:

#include <stdlib.h>

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

Generates this output

$ ./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]
... <snip>

However, it is not being written to stderr or stdout, but /dev/tty (which I discovered using 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

How do I redirect this to a file? The standard stdout and stderr redirects don't work. I need to catch this for a systemd service, and right now, the output is disappearing into the ether.


回答1:


I found an UNDOCUMENTED (not in the glibc documentation!) answer by inspecting the libc source code, libc_fatal.c.

Set the following environment variable to anything

LIBC_FATAL_STDERR_=1

to cause libc to write to stderr instead of /dev/tty.



来源:https://stackoverflow.com/questions/32056387/catching-libc-error-messages-redirecting-from-dev-tty

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!