我正在编写一个小的客户端/服务器应用程序,该应用程序使用ncurses
作为客户端上的TUI工具包。客户端是多线程的,有一个用于与服务器通信(通过套接字)的线程和一个处理UI的线程。我发现了一个错误,我想逐步按照客户的指示查看问题所在。
在gdb
中简单地运行客户端是行不通的,因为gdb
使用与客户端相同的终端,因此输出全部被弄乱了,这使得读取gdb
的输出确实非常困难,而且似乎也会干扰curses
(例如, halfdelay
模式,当逐步执行说明时,我无法将任何按键发送给客户端,因为每次程序经过一段时间后都会降为gdb
。)
有没有办法在“专用终端”中运行gdb
?我应该使用其他方法来调试此应用程序吗?您对在这种特定情况下如何减少障碍数量有何建议?
1实际的错误是,经过一定数量的操作(以完全确定性的方式)后,UI不会更新,而是等待额外的按键(因为我已经精确设置了halfdelay
模式以避免这种情况,所以不需要这样做) )。我想知道客户在那一刻在做什么。
最佳答案
您可以使用tty
gdb命令将gdb和程序的输出分开。这是从Peter's gdb Tutorial进行操作的详细说明:
转到第一个xterm并使用tty或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拍打它以退出睡眠状态。