У меня есть код (std :: cout), который отправляет операторы на стандартный выход, но они не отображаются в консоли gdb.
И вы не должны этого ожидать.
Когда приложение запускается, его сообщения std::cout
отправляются в файловый дескриптор 1 (stdout
). Это может быть окно терминала, в котором было запущено приложение, или файл, если вывод был перенаправлен. Это также может быть канал или /dev/null
.
GDB не «крадет» этот вывод (в противном случае было бы труднее отлаживать программу, которая является источником ввода для другой программы, проходящей через pipe).
Ваша первая задача должна состоять в том, чтобы определить , где идет вывод. На Linux это обычно так же просто, как ls -l /proc/$pid/fds/1
(заменить $pid
фактическим идентификатором процесса, который вы отлаживаете).
Дополнительная сложность заключается в том, что stdout
может быть полностью буферизован (если он попадает в файл, канал или сокет) и может не быть flush
изменен к моменту достижения вашей точки останова.
PS Теоретически вы можете «украсть» вывод откуда бы он ни был перейти к вашему текущему терминалу, выполнив следующие команды GDB:
(gdb) print open("/dev/tty", 2, 0) # open new fd in the inferior process
# going to current terminal.
# This will print something, e.g. 5
# Now make stdout go to that newly-opened fd
(gdb) call dup2($whatever_last_command_printed, 1)
, но я бы не рекомендовал этого, так как это может неожиданным образом мешать работе программы.