gdb + osx: перенаправление stdout может привести к тому, что printf будет иметь буфер 2 ** 14 байтов? - PullRequest
2 голосов
/ 20 мая 2010

Я подключен к программе с GDB в OSX, и я хочу использовать CFShow в консоли GDB и т. Д. Однако ничего не появляется. printf также ничего не показывает:

(gdb) call (int) printf("Hello\n")
$10 = 6
(gdb) call (int) printf("Hello World!\n")
$11 = 13

Apple предлагает следующий совет для подключения к gdb, чтобы вывод отображался в консоли gdb:

(gdb) call (void) close(1)
(gdb) call (void) close(2)
(gdb) shell tty
/dev/ttyp1
(gdb) call (int) open("/dev/ttyp1", 2, 0)
$1 = 1
(gdb) call (int) open("/dev/ttyp1", 2, 0)
$2 = 2

В консоли gcode xcode tty выдает "not a tty", поэтому я попробовал это в gdb в терминале. Там tty работает, но после перенаправления стандартного вывода все еще нет вывода. Также нет вывода, если я направляю стандартный вывод в файл ..: /

Любое спасение?

Обновление / More-подробности

В некоторых программах (например, TextMate) этот метод работает. Приложение, которое я пытался отладить, /Developer/Applications/Audio/AU\ Lab.app. По какой-то причине этот трюк не работает там .. Обновление: кажется, реальное объяснение довольно:

Если после подключения я перенаправляю стандартный вывод перед вызовом printf в первый раз, это работает! Если я сначала printf и только потом перенаправляю вывод, вывод отображается только после выполнения printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n") и последующего нажатия Enter (для повторения последней команды) 327 раз.

Так что я думаю, что перенаправление stdout каким-то образом приводит в замешательство libc и заставляет его по какой-то причине использовать буфер размером 2**14 байтов?

1 Ответ

1 голос
/ 01 июня 2010

Проблема может быть связана с особенностью вашей настройки. Вот еще несколько советов, которые вы можете попытаться определить источник проблемы:

  1. Во-первых, проверьте способ запуска отладчика - используете ли вы командную строку в терминале или через какой-то графический интерфейс, который может передавать дополнительные аргументы командной строки вне вашего контроля? (Вы упомянули XCode, но я не понимаю, почему вы должны отлаживать программу, которую вы упомянули через XCode? И на самом деле я не уверен, как XCode выполняет GDB, поэтому, пожалуйста, попробуйте подключиться к терминалу сейчас!) *

  2. У вас есть init-файл в вашем домашнем каталоге (файл с именем .gdbinit или около того), который настраивает gdb с некоторыми опциями, о которых вы не знаете? Вот описание того, что gdb делает при запуске: http://sourceware.org/gdb/current/onlinedocs/gdb/Startup.html#Startup

  3. Согласно странице руководства, использование опции -n при запуске предотвратит загрузку любых файлов конфигурации: http://sourceware.org/gdb/current/onlinedocs/gdb/Mode-Options.html#Mode-Options Устранена ли ваша проблема, если вы используете этот переключатель?

  4. Один определенный набор команд относится к ведению журнала GDB: http://sourceware.org/gdb/current/onlinedocs/gdb/Logging-Output.html#Logging-Output Можете ли вы выполнить show logging на консоли и проверить, что происходит с выводом?

  5. Какой вывод show inferior-tty? Если он установлен на "", то он будет таким же, как ваша консоль GDB (что нормально). В противном случае выходные данные программы пойдут куда-то еще, но это не может объяснить проблему, которая возникла с исчезновением вывода из интерактивных команд GDB!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...