2017-02-07 10 views
0

Я использую gdb для отладки следующей программы в ubuntu 16.04.Как вводить с клавиатуры при отладке с помощью удаленного режима gdb?

#include<iostream> 
using namespace std; 
int main() { 
    int n; 
    cin>>n; 
    cout<<n<<endl; 
    return 0; 
} 

Когда я отлаживаю его локально, я могу вводить данные с клавиатуры. Однако, когда я отлаживаю использование сервера gdb, я застреваю, когда пытаюсь ввести данные с помощью stdin. Кто-нибудь знает, как решить эту проблему?

+0

Вы можете запустить свою программу, найти идентификатор процесса (например, xxxx) для программы. Откройте gdb с помощью «$ gdb -pid xxxx» или если gdb открыт »(gdb) attach xxxx». Возможно, вам сначала понадобится sudo gdb. Это работает лучше, если вы используете экран или tmux и т. Д. – InfinitelyManic

ответ

2

К сожалению, gdbserver не поможет вам в этом случае (на данный момент). Он просто запускает программу, используя gdbserver 's tty, которая находится на удаленной машине. Это печально, потому что удаленный протокол GDB has extensions to manage this, но gdbserver не реализует его (пока).

Значит, вам нужно самому управлять своей программой tty. Наиболее полным решением является использование socat для создания «удаленного TTY» для вас и вашей программы.

На удаленной машине:

$ socat TCP-LISTEN:12345 EXEC:'<your program>',ptmx 

Опция ptmx позволяет использовать в качестве PTY межпроцессного коммуникационного механизма вместо socketpair. Это даст вам более тонкое управление буферизацией с использованием настроек tty, непосредственно встроенных в CLI socat (см. man socat). В этом случае по умолчанию он просто буферизуется, пока символ новой строки не будет написан <your program>.

С другой стороны, запустите:

$ socat - TCP:localhost:12345 

И теперь у вас есть удаленный телетайп, кроме GDB-х.
Предполагается, что вы можете запустить socat на своей цели и подключиться к нему через сеть TCP.

Если вы не можете, вы также можете использовать бесплатную последовательную линию, stty ваших настройки и запустить программу против него с помощью переназначения оболочки:

$ stty -F /dev/ttyUSB0 raw 9600 
$ exec command <> /dev/ttyUSB0 >&0 2>&1 

Как объяснены в this answer.

В любом случае, вы обязательно должны обернуть свое решение, а gdbserver имеет опцию --wrapper, позволяющую вам сценарий, как программа запускается при использовании --multi.

Обратите внимание, что при использовании многоуровневых решений для удаленного запуска socat и автоматического присоединения к разветвленной программе, которую вы хотите отлаживать, сейчас слишком сложно объяснить и использовать.