【问题标题】:Debugging ncurses application with gdb使用 gdb 调试 ncurses 应用程序
【发布时间】:2023-07-10 08:07:01
【问题描述】:

我正在尝试使用 gdb 调试我的 ncurses 应用程序。我使用 tty 命令将程序的 I/O 重定向到另一个终端。输出就像一个魅力,但我遇到了输入问题。我正在使用 getch() 函数来检索我的应用程序中的符号。因此,例如,如果我在我的 gdb 会话中这样做:

tty /dev/pts/5

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

【问题讨论】:

标签: c input gdb ncurses


【解决方案1】:

您可以附加到您的进程以从不同的终端进行调试,而不是尝试从gdb 中运行应用程序。

正常运行您的流程。当它被阻止用户输入时,找到它的进程 ID,然后从另一个窗口使用 gdb 附加到它:

gdb -p <PID>

您的问题是由于程序仍希望其交互式输入来自您的gdb 会话。

【讨论】:

  • 感谢您提供此解决方案。但问题仍然没有解决。我连接到我的过程。然后我在我的 gdb 会话中点击 continue 并卡住了 - 我可以使用我的 ncurses 应用程序,但不能使用 gdb。
  • @UgnichenkoDmitriy:您必须设置断点,或者使用 Ctrl-C 中断gdb 中的进程。
  • 是的,它确实有帮助。我已经用 file 加载了我的符号表并设置了我的 bp。谢谢。
  • 顺便说一句,对于那些无法将 gdb 连接到他们的进程并运行 Ubuntu 的人,您应该 echo 0 > /proc/sys/kernel/yama/ptrace_scope 或将其永久化并设置为 0 /etc/sysctl.d/10-ptrace.conf
  • 另一种成功将 gdb 附加到进程的方法是以 root 身份运行 gdb。这是由 GDB 提出的:Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf
【解决方案2】:

也许现在回答有点晚了,但希望这会有所帮助: 花了一些时间弄清楚如何调试 ncurses 应用程序, 最后我在 gdbservertmux 的帮助下做了一个非常舒适的方法。

这样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 在左侧等待点击继续或任何其他常见的 gdb 东西:)

退出后,tmux 会自动关闭 gdbserver(因此右侧面板也是如此),仅此而已:)

【讨论】:

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