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

时间:2017-02-07 09:10:58

标签: gdb gdbserver

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

.done

当我在本地调试它时,我能够使用键盘输入数据。但是,当我使用gdb服务器进行调试时,当我尝试使用stdin输入数据时,我会陷入困境。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

不幸的是,gdbserver在这种情况下(暂时)无法帮助您。它只是使用gdbserver的tty启动程序,它位于远程计算机上。这很不幸,因为GDB远程协议has extensions to manage this,但gdbserver没有实现它(到目前为止)。

所以你必须自己管理你的程序。最完整的解决方案是使用socat为您和您的程序创建“远程TTY”。

在远程计算机上:

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

选项ptmx允许使用PTY作为进程间通信机制而不是socketpair。它将使用tty设置为您提供更精细的缓冲控制,直接在socat的CLI中构建(参见man socat)。在此默认情况下,它只是缓冲,直到<your program>写入换行符。

另一方面,运行:

$ socat - TCP:localhost:12345

现在你有了远程TTY,除了GDB之外 它假设您可以在目标上运行socat,并且可以通过TCP网络连接到它。

如果你不能,你也可以使用免费的串行线,stty你的设置,并使用shell重定向运行你的程序:

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

this answer中所述。

无论如何,你绝对应该包装你的解决方案,gdbserver有一个--wrapper选项,允许你使用--multi编写程序运行方式的脚本。

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