2015-08-17 20 views
5

Hata koşullarını algıladığında libc'nin oluşturduğu hata mesajlarını yakalamaya çalışıyorum. Örneğin, benim test kodu:Libc hata iletilerini yakalamak,/dev/tty yönlendirmesi

#include <stdlib.h> 

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

o stderr'e veya stdout ama/dev/tty (ı kullanarak keşfedilen trace)

yazıldığını değil,

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

Ancak bu çıktıyı üretir

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 

Bunu bir dosyaya nasıl yönlendiririm? Standart stdout ve stderr yönlendirmeleri çalışmıyor. Bunu bir sistem servisi için yakalamam gerekiyor ve şu anda çıktı etere doğru kayıyor.

+0

Yinelenen: [SİLİNDİR HATASI STDERR'e nasıl yönlendirilir?] (Http://stackoverflow.com/questions/4290336/how-to-redirect-runtime-errors-to-stderr) –

cevap

7

libc source code, libc_fatal.c denetleyerek bir UNDOCUMENTED (glibc belgelerinde değil!) Yanıtını buldum.

Seti şey

LIBC_FATAL_STDERR_=1 

için aşağıdaki ortam değişkeni stderr yerine /dev/tty yazmak için libc neden.

İlgili konular