使用GDB进行调试时,如何将std :: cin重定向到Linux终端?

Abe*_*ant 2 c++ linux terminal gdb cin

在Linux中,GDB不允许set new-console on使用,而是使用tty。用

set inferior-tty /dev/pts/[number of an active console]

在.gdbinit文件中(每次都需要编辑编号),它会重定向std::cout,但std::cin无法正常工作。它只是将我的输入解释为好像我正在发送bash命令并报告错误,并且我的程序继续等待输入。在那之后,我不能再在控制台中键入内容,因此我假设std::cin 被重定向,但无法正常工作。

我尝试查找如何从应用程序本身启动终端。我只能找到这个答案,其中还提到了一个不重定向输入的错误。

有什么方法可以解决此问题,std::cinstd::cout在调试时将其正确重定向(和)到Linux终端?


背景信息:我想要做的应该很简单。>使用std :: cin之前,请在用户输入前打印a 。我在这里有简单的代码,可以打印出来>,先冲洗cout然后调用getline()。当正常运行程序时,它可以工作。但可悲的是,GDB拒绝刷新流时,没有一个换行符,所以它不打印>,忽略用户输入的第一个字符,然后版画的>,紧接着,我的程序发送,因为错误信息残缺的输入字符串。

在Windows中,我通过使用创建.gdbinit文件来解决此问题set new-console on。这导致GDB代替自己的Windows控制台使用Windows控制台,并且按预期方式工作。

n. *_* m. 5

如果需要在程序有机会暂停后开始调试,只需在终端中运行该程序,然后gdb - your-program-pid在另一个终端中运行。否则,有一系列步骤比描述要快。

  1. 启动两个终端窗口。
  2. 在一个终端中,找出外壳的PID。ps应该告诉你。
  3. 在另一个终端中,使用以下命令

    $ gdb - pid-of-the-other-shell
    (gdb) br main
    (gdb) c
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在,您已将gdb附加到另一个终端上的shell中。不太有用。

  5. 在第一个终端中,在shell提示符下键入

    $ exec your-program
    
    Run Code Online (Sandbox Code Playgroud)

现在,您有一个终端在运行,gdb而另一终端在下运行您的程序gdb,在处停止main。请记住,程序退出时,其终端窗口将关闭。如果您不希望这样做,请在第一个终端中启动第二层外壳,然后将gdb其连接。

您也可以使用set inferior-ttycommand,但是必须确保另一个tty存在并且没有其他程序尝试从中读取。最简单的方法是在另一个终端中运行Shell并给它一个while true; do sleep 1000; done命令。请注意,您可能会收到warning: GDB: Failed to set controlling terminal: Operation not permitted消息。他们是无害的。