![在后台运行 GDB](https://linux22.com/image/220960/%E5%9C%A8%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C%20GDB.png)
我正在开发一个程序,其中有 2 个 ncurses 窗口,一个显示使用 fork+exec 实现的自定义 shell,另一个我想显示有关在我的 shell 上运行的命令的一些信息。为此,我尝试使用 GDB。
我的想法是在后台运行 GDB,设置一些断点并将一些信息打印到文件中,我的 ncurses 应用程序读取、格式化和显示该文件。
问题是我无法在没有提示的情况下运行 GDB,因为如果输入不是来自终端,它会自动退出。我正在使用以下脚本:
./bin/pE_application &
pid=$(ps -C pE_application -o pid=)
gdb --command=examine_memory.gdb --pid="$pid" > "$GDB_TMP" 2>&1 &
pE_jid=$(jobs | grep pE_application | grep -oE "^\[[0-9]\]" | sed 's/\[//g' | sed 's/\]//g')
fg "%""$pE_jid"
其中 pE_application 是我的 ncurses 应用程序。 Exam_Memory.gdb 是一个启动脚本,它尝试为我的 run_shell 函数设置断点,以便我可以在启动时转储信息:
set follow-fork-mode parent
info functions
break run_shell
command 1
p 'pE_application.c'::unparsed_cmd
continue
end
我尝试过使用批处理模式,但 GDB 将在 init 脚本运行后退出。如果没有批处理模式,GDB 将退出,因为输出不是来自终端,输出文件将如下所示:
*some info*
...
Quit anyway? (y or n) [answered Y; input not from terminal]
或者由于 tty stop 信号而无法运行。我试图找出是否有任何方法可以在没有 I/O 的情况下在后台运行 GDB,只需保持带有断点和命令的启动脚本即可。
谢谢