使用gdb远程模式调试时如何从键盘输入?

使用gdb远程模式调试时如何从键盘输入?,gdb,gdbserver,Gdb,Gdbserver,我使用gdb在ubuntu 16.04中调试以下程序 #include<iostream> using namespace std; int main() { int n; cin>>n; cout<<n<<endl; return 0; } #包括 使用名称空间std; int main(){ int n; cin>>n; 不幸的是,gdbserver在这种情况下(目前)对您没有帮助。它只是使用远程机器上的gdb

我使用gdb在ubuntu 16.04中调试以下程序

#include<iostream>
using namespace std;
int main() {
    int n;
    cin>>n;
    cout<<n<<endl;
    return 0;
}
#包括
使用名称空间std;
int main(){
int n;
cin>>n;

不幸的是,
gdbserver
在这种情况下(目前)对您没有帮助。它只是使用远程机器上的
gdbserver
的tty启动程序。这是不幸的,因为GDB远程协议,但
gdbserver
没有实现它(到目前为止)

因此,您必须自己管理程序的tty。最完整的解决方案是使用
socat
为您和您的程序创建“远程tty”

在远程计算机上:

$ socat TCP-LISTEN:12345 EXEC:'<your program>',ptmx
现在除了GDB之外,您还有您的远程TTY。
它假设您可以在目标上运行
socat
,并且可以通过TCP网络连接到它

如果不能,您还可以使用一条免费的串行线,
stty
设置并使用shell重定向对其运行程序:

$ stty -F /dev/ttyUSB0 raw 9600
$ exec command <> /dev/ttyUSB0 >&0 2>&1
$stty-F/dev/ttyUSB0原始9600
$exec命令/dev/ttyUSB0>&0 2>&1
如中所述

无论如何,您肯定应该包装您的解决方案,
gdbserver
有一个
--wrapper
选项,允许您在使用
--multi
时编写程序运行的脚本


请注意,使用多个劣质解决方案远程运行
socat
并自动附加到分叉程序(您要调试的程序)的错误太多,现在无法解释和使用。

不幸的是,
gdbserver
在这种情况下(目前)对您没有帮助。它只是使用远程计算机上的
gdbserver
的tty启动程序。这是不幸的,因为GDB远程协议,但是
gdbserver
没有实现它(到目前为止)

因此,您必须自己管理程序的tty。最完整的解决方案是使用
socat
为您和您的程序创建“远程tty”

在远程计算机上:

$ socat TCP-LISTEN:12345 EXEC:'<your program>',ptmx
现在除了GDB之外,您还有您的远程TTY。
它假设您可以在目标上运行
socat
,并且可以通过TCP网络连接到它

如果不能,您还可以使用一条免费的串行线,
stty
设置并使用shell重定向对其运行程序:

$ stty -F /dev/ttyUSB0 raw 9600
$ exec command <> /dev/ttyUSB0 >&0 2>&1
$stty-F/dev/ttyUSB0原始9600
$exec命令/dev/ttyUSB0>&0 2>&1
如中所述

无论如何,您肯定应该包装您的解决方案,
gdbserver
有一个
--wrapper
选项,允许您在使用
--multi
时编写程序运行的脚本


请注意,使用多个低级解决方案远程运行
socat
并自动附加到分叉程序(您要调试的程序)的错误太多,现在无法解释和使用。

您可以运行程序,找到程序的进程ID(例如xxxx)。使用“$gdb-pid xxxx”打开gdb,或者如果gdb已打开”(gdb)附加xxxx”。您可能需要先使用sudo gdb。如果您使用屏幕或tmux等,这会更好。您可以运行您的程序,找到程序的进程ID(例如xxxx)。使用“$gdb-pid xxxx”打开gdb或如果gdb已打开”(gdb)附加xxxx。您可能需要先使用sudo gdb。如果您使用屏幕或tmux等,这会更好。