使用gdb调试ncurses应用程序

13

我正在尝试使用gdb调试我的ncurses应用程序。 我使用tty命令将程序的输入/输出重定向到另一个终端。 输出正常,但是输入方面出现了问题。 我在我的应用程序中使用getch()函数来获取符号。 因此,例如,如果我在gdb会话中执行以下操作:

tty /dev/pts/5
我在另一个终端窗口(gnome-terminal)中获得输出。我的gdb会话被卡住了,等待输入,但是当我在我的/dev/pts/5内按任意键时,它会打印出来,但应用程序本身不接受它作为输入符号。在没有gdb的情况下运行一切正常,我还使用了noecho(),因此不应显示符号。 那么问题是什么?是否可能以某种方式处理来自重定向终端的输入?

谢谢。我已经记下了这本书。 - Xentatt
2个回答

18
你可以附加到进程上,在不尝试从gdb内运行应用程序的情况下,从不同的终端调试。正常运行进程,当其因等待用户输入而被阻塞时,找到其进程ID,然后在另一个窗口中使用gdb进行附加。
gdb -p <PID>

你的问题是由于程序仍然期望它的交互输入来自于你的 gdb 会话。


1
谢谢您提供的解决方案。但问题仍未解决。我已连接到我的进程。然后在我的gdb会话中点击继续,但它卡住了——我可以使用我的ncurses应用程序,但无法使用gdb。 - Xentatt
1
@UgnichenkoDmitriy:你必须设置断点,或使用Ctrl-C在gdb中中断进程。 - jxh
是的,它确实有帮助。我已经用file加载了我的符号表并设置了我的断点。谢谢。 - Xentatt
2
顺便提一下,对于那些无法连接到其进程并运行Ubuntu的gdb的人,您应该执行echo 0 > /proc/sys/kernel/yama/ptrace_scope或将其设置为永久性,并在/etc/sysctl.d/10-ptrace.conf中设置0。 - Xentatt
1
另一种成功附加gdb到进程的方法是将gdb作为root运行。这是由GDB提出的:“无法附加到进程。如果您的UID与目标进程的UID匹配,请检查/ proc / sys / kernel / yama / ptrace_scope的设置,或以root用户再次尝试。有关更多详细信息,请参见/ etc / sysctl.d / 10-ptrace.conf。” - hdl

8
也许回答有点晚,但希望这能有所帮助:调试ncurses应用程序需要一些时间,最终我通过使用gdbserver和tmux找到了一种非常舒适的方式。这样可以完全分离gdb和应用程序的I/O:
debug.sh(启动调试的脚本):
#!/bin/bash
tmux splitw -h -p 50 "gdbserver :12345 ./yourapplication"
tmux selectp -t 0
gdb -x debug.gdb

debug.gdb(一行GDB脚本文件,便于使用):

target remote localhost:12345

这样,应用程序将在右侧启动,gdb在左侧等待输入“continue”或其他常规的gdb命令 :)

一旦退出,tmux会自动关闭gdbserver(因此也关闭右侧面板),就这样简单 :)


(当然,重要的是 gdbserver/gdb 一对,tmux 部分可以完全跳过,只是有时在没有更多终端的情况下,将它们并排放置会更容易 :D) - lorenzodarkside
很棒的脚本,真的很好! - Czipperz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接