сглаживающий вывод трассировки стека повреждения памяти glibc - PullRequest
5 голосов
/ 17 августа 2011

Есть ли способ подавить вывод, который генерирует glibc при повреждении памяти?Вот что я вижу

make
*** glibc detected *** /home/myname/php/sapi/cli/php: free(): invalid pointer:  x0045d67f ***
======= Backtrace: =========
/lib/libc.so.6(+0x6eb41)[0x380b41]

<snip>
======= Memory map: ========
00115000-00116000 r-xp 00000000 00:00 0          [vdso]
001d7000-001ee000 r-xp 00000000 ca:01 540738     /lib/libpthread-2.12.2.so
001ee000-001ef000 r--p 00016000 ca:01 540738     /lib/libpthread-2.12.2.so
001ef000-001f0000 rw-p 00017000 ca:01 540738     /lib/libpthread-2.12.2.so
<snip>

Что касается работы, которую я выполняю, мне не безразлична эта информация, важно лишь то, что make не увенчалась успехом (возвращаемое значение! = 0).Эти сообщения заполняют экран, и остальная часть моего вывода становится нечитаемой.Я пытался:

make &> /dev/null
{ make ; } &> /dev/null
x=`make 2>&1` &> /dev/null

, но ни один из них не ловит вывод.Если это не пишется в stderr, откуда, черт возьми, это происходит?Мне бы хотелось решение, которое не требует перестройки glibc, если это возможно.

Вот некоторый код, который выдаст такое сообщение об ошибке, но учтите, что это не имеет ничего общего с кодом, над которым я работаю (исходный код PHP).Я просто хочу отключить этот тип вывода из моей консоли.

int main()
{
    char* ptr = (char*)malloc(sizeof("test"));
    char array[]= "test";
    ptr = array;
    free(ptr);
    return 0;
}

1 Ответ

8 голосов
/ 17 августа 2011

Да: запустите ваш код с переменной среды MALLOC_CHECK_ (конечное подчеркивание является преднамеренным), установленной на 0.

Это , частично документированное в руководстве по libc , хотя кажется, что есть больше вариантов, чем просто 0, 1 или 2, которые предлагаются там. (Значение заканчивается передачей в качестве аргумента action malloc_printerr() в glibc malloc/malloc.c, а значением по умолчанию, похоже, является 3.)

Причина, по которой вы не можете перенаправить его, заключается в том, что он записывается специально в /dev/tty, если вы не установили переменную среды LIBC_FATAL_STDERR_. (Я не уверен, что это где-то задокументировано, но соответствующий код можно найти здесь .)

...