我正在尝试编写与GDB交互的测试,但是在捕获输出时遇到了麻烦。我希望生成一个日志文件,看起来就像手动执行测试在终端中看到的一样。但是,GDB在捕获其输出方面非常顽固。

我已经能够编写Expect脚本,该脚本能够与GDB交互并且其输出可以重定向到日志文件,但是我不想在TCL中编写测试。我希望使用与Java兼容的Groovy。由于Perl的Expect和ExpectJ的某些原因,程序输出总是转到终端,并且无法重定向到文件。

我尝试使用ProcessBuilder从Java启动GDB进程,并且该进程大部分都可以运行,但是print语句的输出永远不会出现在stdout上并且无法捕获。我以为,如果Expect可以正常工作,那么我会从Java启动期望并使其与GDB交互,但是在这种情况下,大部分程序输出都丢失了,从不出现在创建过程的标准输出中。

所以我的问题是,我该如何用Groovy(也可以使用Java)编写一个与GDB交互并可以捕获所有输出的测试?

伪代码:

process ="gdb -q".execute()
waitForPrompt()
send("file exec")
waitForPrompt()
send("run")
send("quit")

日志文件:

(gdb) file exec
Reading symbols from exec...done.
(gdb) run
Starting program: exec
Program exited normally.
(gdb) quit

如果您的测试涉及使用gdb实际调试某些东西,而不是测试gdb本身,则您可能应该考虑使用gdb / mi接口。

我已经考虑过了,但是想要一个对不熟悉脚本语言的人友好的日志文件。

一种可能是GDB输出由于标准错误而被转储,而您仅捕获标准输出。 您应该能够通过重定向解决此问题,我认为是这样的:

process ="gdb -q 2&>1".execute()

第二个猜测是,可能需要检查在工作和非工作情况下"显示交互模式"的内容。 如果它们不同,则在执行任何其他操作之前,请尝试"将交互模式设置为关闭"。

第三种选择是使用GDB的日志记录工具来编写日志文件("设置日志文件"和"设置日志记录"),而不必自己捕获输出。

我没有在这里列出它,因为我想简短些,但是我已经将stderr与stdout合并了-它也不在那里。 我现在意识到,尽管输出只是没有被GDB刷新! 另一个命令和输出出现。 日志记录选项有效,但不包括发送到GDB的命令。 您可以使用" set trace-commands on"来获取它们。 不完全相等,因为每个打印都以" +"为前缀,但足够接近。 谢谢!