我正在编写一个小型客户端/服务器应用程序,它使用 ncurses 作为客户端的 TUI 工具包。客户端是多线程的,有一个线程用于与服务器通信(通过套接字)和一个处理 UI 的线程。我发现了一个错误,我想按照客户的说明逐步查看问题所在1。
简单地在 gdb 中运行客户端是行不通的,因为 gdb 使用与客户端相同的终端,因此输出都是乱七八糟的,这真的很难读取 gdb 的输出,它似乎也干扰了 curses(例如,使用 halfdelay 模式,当逐步执行指令时,我不是能够向客户端发送任何按键,因为每次程序都会在一小段时间后下降到 gdb。)
有没有办法在“专用终端”中运行 gdb?我应该使用不同的方法来调试这个应用程序吗?对于如何减少此特定上下文中的障碍,您有什么建议吗?
1 实际的错误是,在一定数量的操作之后(并且以完全确定的方式),UI 没有更新,而是等待额外的按键(这不应该是必需的,因为我已经精确地设置了 halfdelay 模式来避免这种情况)。我想知道客户在那一刻正在做什么。
请您参考如下方法:
您可以使用tty gdb 命令将gdb 和程序的输出分开。这是来自 Peter's gdb Tutorial 的详细说明:
转到第一个 xterm 并使用 tty 或 who am i 找到它的设备文件。这将是带有 GDB I/O 的 xterm。:
$ tty
/dev/pts/1
$ who am i
p pts/1 May 26 12:44 (:0.0)
转到第二个 xterm 并找到它的设备文件。这将是带有我们程序 I/O 的 xterm:
$ tty
/dev/pts/4
回到第一个 xterm 并开始调试 session 。在 Print_A_Character() 处设置断点。
$ gdb debugging_ncurses
(gdb) break Print_A_Character
Breakpoint 1 at 0x80486fd: file debugging_ncurses.c, line 26.
(gdb)
GDB 的 tty 命令指示 GDB 将程序的 I/O 重定向到另一个终端。 tty 的参数是您希望程序 I/O 运行的终端的设备文件。在这种情况下,我希望程序的 I/O 转到第二个 xterm,pts/4。如果您继续,请使用您在第 2 步中获得的任何设备文件:
(gdb) tty /dev/pts/4
(gdb)
最后,转到第二个 xterm(包含程序的 I/O)并告诉 shell 长时间休眠。这样一来,我们在该窗口中键入的任何内容都将确保进入我们的程序而不是 shell。时间量是任意的,但选择一个比您怀疑调试 session 将持续的时间更长的时间。这告诉 shell 在 100000 秒内“什么都不做”:
$ tty
/dev/pts/4
$ sleep 100000
回到第一个运行 GDB 的 xterm 并调试到你想要的内容。完成后,您可以返回程序输出窗口并用 control-c 轻击它以打破 sleep 状态。




