2010-02-23 42 views
1

我正在尝试编写与GDB交互的测试,但在捕获输出时遇到了问题。我想要生成一个日志文件,看起来像在终端上看到的那样,手动执行了测试。然而,GDB在捕捉其输出时被证明是非常固执的。编写使用GDB的测试 - 如何捕获输出?

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

我试着从Java使用ProcessBuilder开始一个GDB进程,它主要工作,但打印语句的输出永远不会出现在标准输出上,并且不能被捕获。我认为如果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 

回答

1

一种可能性是,GDB的输出被倾倒在标准错误,你只能捕获标准输出。您应该能够通过重定向解决这个问题,这样的事情,我认为:

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

第二种猜测是,它可能需要检查什么“Show互动模式”在工作和非工作情况下,说: 。如果他们不同,在做其他事情之前尝试“设置交互模式”。

第三个选择是使用GDB的日志工具来写入日志文件(“set logging file”和“set logging on”)并避免自己捕获输出。

+0

我没有在这里列出,因为我想保持简短,但我已经将stderr与标准输出合并 - 它不在那儿。我现在意识到,虽然输出只是没有被GDB冲昏了头脑!出现另一个命令和输出。 日志记录选项可用,但不包括发送到GDB的命令。你可以使用“set trace-commands on”来获取它们。不完全相同,因为每个打印都以“+”为前缀,但足够接近。 谢谢! – dromodel 2010-02-23 20:57:42

1

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

+0

我已经考虑过它,但想要一个对那些不熟悉脚本语言的人友好的日志文件。 – dromodel 2010-02-25 02:41:48