2016-05-30 2 views
0

Я хочу отлаживать общую библиотеку, которая вызывается моей программой. Общие выходы lib в отдельный файл журнала: shared-lib.log. Я хотел бы перенаправить вывод lib в gdb (я хочу перенаправить вывод на тот же терминал, где работает GDB). Я попытался следующие:gdb: Как перенаправить лог-файл общей библиотеки на вывод gdb

(gdb) run myprogram shared-lib.log>1 

(gdb) run myprogram shared-lib.log>/dev/stdout 

(gdb) run myprogram /dev/stdout 

Но это не работает, а также с полным именем пути /var/log/shared-lib.log.

+0

Что означает «перенаправить вывод lib в gdb»? Вы хотите использовать его в качестве ввода командной строки gdb? Вы пробовали делать «shared-lib.log» fifo, а затем читать с fifo с помощью какого-то другого инструмента, такого как 'cat',' tee' или даже перенаправления оболочки? – Paulo1205

ответ

1

Общий вывод библиотек в отдельный файл журнала: shared-lib.log.

Если у вас есть источники для этой библиотеки, вы можете изменить его, чтобы не сделать это. Если вы этого не сделаете, вы должны сообщить своим разработчикам, что вы не оценили их выбор в журнале (это нормально, чтобы предоставить способ перенаправления выходных файлов библиотеки, но не стоит настаивать на этом, не позволяя вам самим решать).

Я хотел бы перенаправить вывод lib в gdb.

Предположительно, вы хотите перенаправить этот вывод на тот же терминал, на котором работает GDB, чтобы вы могли видеть, как выглядит выход библиотеки, когда вы проходите через вашу программу.

Вы могли бы попробовать это в качестве первого шага:

rm -f shared-lib.log && ln -s /dev/tty shared-lib.log 

Если библиотека просто делает open("shared-lib.log", O_WRONLY|O_CREAT, ...) то, что должно быть достаточно. Но это не сработает, если библиотека сначала выполнит unlink("shared-lib.log").

В этом случае не все потеряно, но становится все труднее. Вы хотели бы узнать, какой файловый дескриптор записывает библиотека (на Linux, ls -l /proc/<pid-of-inferior>/fd вам следует рассказать). Вы также хотели бы организовать открытый fd2, идущий к /dev/tty. Наконец, вы хотите вызвать dup2($fd, $fd2), чтобы перенаправить вывод библиотеки на терминал. Вам также может понадобиться fflush(NULL) в вашей программе, иначе библиотека может полностью буферировать свой отладочный вывод (так как он считает, что его вывод идет в файл, а stdio полностью заполняет такой вывод по умолчанию).

+0

Спасибо, первый шаг не сработал, но он умный. Второй шаг не работает в моем случае, потому что я не получаю разумный файловый дескриптор. Их много, и я не получаю ссылку на lib. У меня есть исходный код. Поэтому я должен сделать старый персонал. Спасибо за отличный ответ. – musbach