Подтвердить что ты не робот

Glibc backtrace - не может перенаправлять вывод в файл

Я в процессе отладки программы C (я не писал). У меня есть все внутренние инструменты отладки (целая куча printf), и я написал небольшой PHP script, который использует proc_open() и просто захватывает как stdout, так и stderr, а также координаты времени в одном файле.

В настоящий момент двоичный файл умирает с ошибкой realloc(), которая попадает в glibc, и отображается backtrace glibc, начиная с:

*** glibc detected *** /sbin/rsyslogd: realloc(): invalid next size: 0x00002ace626ac910 ***

Здесь я не понимаю: я подтвердил, что PHP script захватывает как stdout, так и stderr из двоичного процесса и записывает их в правильные файлы, но эта обратная трассировка все еще печатается на консоли. Откуда это? Есть ли какой-то магический выходной канал, отличный от stdout и stderr?

Любые идеи о том, как я собираюсь захватить эту обратную трассировку в файл или отправить его с помощью stderr?

Спасибо, Джейсон

4b9b3361

Ответ 1

Извините... Я задал вопрос примерно через полчаса по поиску в Google, но после небольшого расследования я нашел решение... в списке рассылки Fedora (http://www.redhat.com/archives/rhl-devel-list/2009-August/msg00982.html), рассматривая эту проблему в системе сборки Koji...

export LIBC_FATAL_STDERR_=1

По-видимому, по умолчанию отчеты об ошибках по какой-либо причине идут прямо в/dev/tty...

Ответ 2

Список рассылки, на который ссылается Джейсон, также предлагает некоторые более сложные решения:

ИМХО koji (и макет, если на то пошло) должен запускать сборки внутри пейп-пэт, выход которого он регистрирует в любом случае, даже если они перенаправляют все. Вы никогда не знаете, какую сумасшедшую чепуху какой-то пакет попытается попробовать. (Roland McGrath, http://www.redhat.com/archives/rhl-devel-list/2009-August/msg00982.html)

Следующие сообщения предлагают использовать пакет pty python для выполнения этого.