我正在编写一个小客户端/服务器应用程序,它在客户端上使用ncurses
作为TUI工具包。客户端是多线程的,有一个用于与服务器通信的线程(通过套接字)和一个处理UI的线程。我发现了一个错误,我想逐步完成客户的指示,看看问题出在哪里 1 。
简单地在gdb
中运行客户端不起作用,因为gdb
使用与客户端相同的终端,因此输出全部搞砸了,这使得很难读取{的输出{1}}它似乎也会干扰gdb
(例如curses
模式,当单步执行指令时,我无法向客户端发送任何按键,因为每次程序都是如此在很短的时间后降至halfdelay
。)
有没有办法在“专用终端”中运行gdb
?我应该使用不同的方法来调试此应用程序吗?您对如何减少特定背景中的障碍数量有任何建议吗?
1 实际的错误是,在一定数量的操作(以及完全确定的方式)之后,UI未更新,但等待额外的按键操作(因为我已经精确设置了gdb
模式以避免这种情况,所以不需要这样做)。我想知道客户在那个确切的时刻正在做什么。
答案 0 :(得分:5)
您可以使用tty
gdb命令分隔gdb和程序的输出。以下是详细说明如何从Peter's gdb Tutorial:
转到第一个xterm并使用tty或者我是谁来查找其设备文件。这将是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打开它以打破睡眠。
答案 1 :(得分:1)
在另一个终端中运行GDB并附加到要调试的正在运行的进程。这应该给你的应用程序和GDB自己的终端。见http://dirac.org/linux/gdb/06-Debugging_A_Running_Process.php