如何使用gdb有效调试多线程curses客户端-服务器应用程序?

Bak*_*riu 2 c multithreading gdb ncurses

我正在编写一个小的客户端/服务器应用程序,该应用程序ncurses在客户端上用作TUI工具包。客户端是多线程的,有一个线程(用于通过套接字与服务器通信)和一个用于处理UI的线程。我发现了一个错误,我想按照客户的指示逐步检查问题所在1

简单地运行客户端gdb是行不通的,因为gdb使用与客户端相同的终端,因此输出全部混乱了,这使得读取它的输出非常困难,gdb并且似乎也会干扰curses(例如halfdelay,在步进时出现模式)根据指示,我无法将任何按键发送给客户端,因为每次程序在gdb经过很短的时间后就会降级到。)

有没有办法gdb在“专用终端”中运行?我应该使用其他方法来调试此应用程序吗?您对在这种特定情况下如何减少障碍数量有何建议?


1实际的错误是,经过一定数量的操作(以完全确定的方式)后,UI 不会更新,而是等待额外的按键(因为我已经halfdelay精确设置了模式以避免这种情况,所以不需要) 。我想知道客户在那一刻在做什么。

ks1*_*322 5

您可以使用ttygdb命令将gdb和程序的输出分开。这是Peter的gdb教程中的详细说明:

转到第一个xterm并使用tty或我是谁来找到其设备文件。这将是GDB I / O的xterm:

   $ tty
   /dev/pts/1
   $ who am i
   p        pts/1        May 26 12:44 (:0.0)
Run Code Online (Sandbox Code Playgroud)

转到第二个xterm并找到其设备文件。这将是我们程序的I / O的xterm:

   $ tty
   /dev/pts/4
Run Code Online (Sandbox Code Playgroud)

返回第一个xterm并开始调试会话。在Print_A_Character()处设置一个断点。

   $ gdb debugging_ncurses
   (gdb) break Print_A_Character 
   Breakpoint 1 at 0x80486fd: file debugging_ncurses.c, line 26.
   (gdb) 
Run Code Online (Sandbox Code Playgroud)

GDB的tty命令指示GDB将程序的I / O重定向到另一个终端。tty的参数是您希望程序I / O进入的终端的设备文件。在这种情况下,我希望程序的I / O转到第二个xterm,pts / 4。如果要继续,请使用在步骤2中获得的任何设备文件:

   (gdb) tty /dev/pts/4
   (gdb) 
Run Code Online (Sandbox Code Playgroud)

最后,转到第二个xterm(包含程序的I / O),并告诉Shell长时间睡眠。这样一来,我们在该窗口中键入的任何内容都将确保进入程序而不是shell。时间是任意的,但是选择的时间要比您怀疑调试会话将持续的时间长。这告诉shell在100000秒内“不执行任何操作”:

   $ tty
   /dev/pts/4
   $ sleep 100000
Run Code Online (Sandbox Code Playgroud)

返回运行GDB的第一个xterm并调试您的内心内容。完成后,您可以返回程序输出窗口,并用Control-C拍打它以退出睡眠状态。