我正在使用gdb在ubuntu 16.04中调试以下程序。
.done
当我在本地调试它时,我能够使用键盘输入数据。但是,当我使用gdb服务器进行调试时,当我尝试使用stdin输入数据时,我会陷入困境。有谁知道如何解决这个问题?
答案 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
并自动附加到分叉程序(您要调试的程序),现在无法解释和使用。