Как сделать так, чтобы операторы отладки C ++ появлялись в консоли gdb - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь отладить приложение в gdb, работающем на Ubuntu 18.04.

В некоторых частях кода я могу установить точки останова и успешно отладить проблемы.

Но в других частях, срабатывание точки останова приводит к завершению процесса.

Есть ли способ, как я могу заставить дебютные операторы отображаться в консоли gdb?

В настоящее время я использую gdb для подключения к процессу, а затем отлаживаю из этот момент.

1 Ответ

1 голос
/ 30 мая 2020

У меня есть код (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)

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

...