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::cin并std::cout在调试时将其正确重定向(和)到Linux终端?
背景信息:我想要做的应该很简单。>使用std :: cin之前,请在用户输入前打印a 。我在这里有简单的代码,可以打印出来>,先冲洗cout然后调用getline()。当正常运行程序时,它可以工作。但可悲的是,GDB拒绝刷新流时,没有一个换行符,所以它不打印>,忽略用户输入的第一个字符,然后做版画的>,紧接着,我的程序发送,因为错误信息残缺的输入字符串。
在Windows中,我通过使用创建.gdbinit文件来解决此问题set new-console on。这导致GDB代替自己的Windows控制台使用Windows控制台,并且按预期方式工作。
如果需要在程序有机会暂停后开始调试,只需在终端中运行该程序,然后gdb - your-program-pid在另一个终端中运行。否则,有一系列步骤比描述要快。
ps应该告诉你。在另一个终端中,使用以下命令
$ gdb - pid-of-the-other-shell
(gdb) br main
(gdb) c
Run Code Online (Sandbox Code Playgroud)现在,您已将gdb附加到另一个终端上的shell中。不太有用。
在第一个终端中,在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消息。他们是无害的。