使用gdb远程模式调试时如何从键盘输入?
我使用gdb在ubuntu 16.04中调试以下程序使用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
#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等,这会更好。