我正在尝试编写与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
<... output ...>
Program exited normally.
(gdb) quit
答案 0 :(得分:1)
一种可能性是GDB输出被转储为标准错误而您只捕获标准输出。你应该能够通过重定向解决这个问题,我认为这样:
process = "gdb -q 2&>1".execute()
第二个猜测是,在工作和非工作情况下,可能需要检查“显示交互模式”的内容。如果它们不同,请在执行任何其他操作之前尝试“设置交互模式”。
第三种选择是使用GDB的日志工具来编写日志文件(“设置日志文件”和“设置登录”)并避免必须自己捕获输出。
答案 1 :(得分:1)
如果您的测试涉及使用gdb实际调试某些东西,而不是测试gdb本身,那么您应该考虑使用gdb / mi接口。