12

我正在尝试使用 gdb 调试我的 ncurses 应用程序。我使用tty命令将程序的 I/O 重定向到另一个终端。输出就像一个魅力,但我遇到了输入问题。我正在使用 getch() 函数来检索我的应用程序中的符号。因此,例如,如果我在我的 gdb 会话中这样做:

tty /dev/pts/5

我在终端窗口的另一个选项卡(gnome-terminal)中得到我的输出。我的 gdb 会话卡住了,等待输入,但是当我按下 /dev/pts/5 中的任何键时,我将其打印出来,但应用程序本身并没有将它作为输入符号。在没有 gdb 的情况下运行一切正常,我也在使用 noecho(),因此不应显示符号。所以有什么问题?是否有可能以某种方式处理来自重定向终端的输入?

4

2 回答 2

17

您可以附加到您的进程以从不同的终端进行调试,而不是尝试从内部运行应用程序gdb

正常运行您的流程。当它被阻止用户输入时,找到它的进程 ID,然后gdb从另一个窗口附加到它:

gdb -p <PID>

您的问题是由于程序仍希望其交互式输入来自您的gdb会话。

于 2012-08-15T07:17:20.867 回答
7

也许回答有点晚了,但希望这会有所帮助:花了一些时间来弄清楚如何调试 ncurses 应用程序,最后我在gdbservertmux的帮助下做了一个非常舒适的方法。

这样 gdb 的 I/O 和应用程序就完全分离了:

debug.sh(开始调试的脚本):

#!/bin/bash
tmux splitw -h -p 50 "gdbserver :12345 ./yourapplication"
tmux selectp -t 0
gdb -x debug.gdb

debug.gdb(单行 gdb 脚本文件,方便起见):

target remote localhost:12345

所以这样,应用程序在右侧启动,gdb 在左侧等待点击继续或任何其他常见的 gdb 东西:)

退出后,tmux 会自动关闭 gdbserver(因此也是右侧面板),仅此而已:)

于 2016-11-12T23:35:41.137 回答