2013-04-30 43 views
1

我正在编写一个小型客户端/服务器应用程序,它在客户端上使用ncurses作为TUI工具包。客户端是多线程的,有一个用于与服务器通信的线程(通过套接字)和一个处理UI的线程。我发现了一个错误,我想按照客户的指示来查看问题出在哪里。如何使用gdb有效地调试多线程curses客户端 - 服务器应用程序?

只运行在gdb客户端不起作用,因为gdb使用相同的终端作为客户端,从而输出全乱了,这使得它真的很难读的gdb输出,而且似乎也干扰curses(例如用halfdelay模式,通过我不能给任何按键发送到客户端中的指令时,因为每次节目降至gdb的时间后,少量)。

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


实际的错误就是UI,一定数量的动作后(并在完全确定方式),不更新,但对于一个额外的按键等待(这不应该是因为我已经设置了halfdelay模式来避免这种情况)。我想知道当时客户在做什么。

+0

@downvoter护理解释? – Bakuriu 2016-10-09 12:49:33

回答

4

可以使用tty gdb命令分隔gdb和程序的输出。这里有详细的说明如何从Peter's gdb Tutorial

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

$ 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和调试你的心脏的内容。当你完成,你可以回去了程序的输出窗口,并配有控制-C打破休眠的一巴掌吧。

相关问题