2

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

简单地运行客户端gdb是行不通的,因为gdb它使用与客户端相同的终端,因此输出全部混乱,这使得读取输出非常困难,gdb而且似乎也干扰curses(例如halfdelay模式,在步进时通过说明,我无法向客户端发送任何按键,因为每次程序都会gdb在一小段时间后下降。)

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


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

4

2 回答 2

5

tty您可以使用gdb 命令分离 gdb 和程序的输出。以下是Peter 的 gdb 教程中的详细说明:

转到第一个 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 并开始调试会话。在 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。时间量是任意的,但选择一个比您怀疑调试会话持续时间更长的时间。这告诉 shell 在 100000 秒内“什么都不做”:

   $ tty
   /dev/pts/4
   $ sleep 100000

回到第一个运行 GDB 的 xterm 并根据您的需要进行调试。完成后,您可以返回程序输出窗口并用 control-c 拍打它以摆脱睡眠。

于 2013-04-30T16:44:00.140 回答
1

在另一个终端中运行 GDB 并附加到您要调试的正在运行的进程。这应该为您的应用程序和 GDB 提供自己的终端。见http://dirac.org/linux/gdb/06-Debugging_A_Running_Process.php

于 2013-04-30T16:30:18.197 回答