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