Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编写使用GDB的测试-如何捕获输出?_Java_Groovy_Gdb_Expect - Fatal编程技术网

Java 编写使用GDB的测试-如何捕获输出?

Java 编写使用GDB的测试-如何捕获输出?,java,groovy,gdb,expect,Java,Groovy,Gdb,Expect,我试图编写与GDB交互的测试,但在捕获输出时遇到了问题。我希望生成一个日志文件,它看起来像是手动执行测试时在终端中看到的。然而,事实证明,GDB在获取其产出方面非常顽固 我已经能够编写Expect脚本,这些脚本能够与GDB交互,其输出可以重定向到日志文件,但我不想在TCL中编写测试。我希望使用Groovy,它与Java兼容。由于某种原因,使用Perl的Expect和ExpectJ时,程序输出总是发送到终端,不能重定向到文件 我尝试使用ProcessBuilder从Java启动一个GDB进程,它基

我试图编写与GDB交互的测试,但在捕获输出时遇到了问题。我希望生成一个日志文件,它看起来像是手动执行测试时在终端中看到的。然而,事实证明,GDB在获取其产出方面非常顽固

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

我尝试使用ProcessBuilder从Java启动一个GDB进程,它基本上可以工作,但打印语句的输出从来没有出现在标准输出上,也无法捕获。我认为如果Expect工作,那么我会从Java启动Expect并让它与GDB交互,但在这种情况下,大多数程序输出都会丢失,不会出现在所创建进程的标准输出中

所以我的问题是,我怎样才能用GroovyJava编写一个与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

一种可能性是GDB输出被转储为标准错误,而您只捕获标准输出。您应该能够通过重定向来修复此问题,我认为:

 process = "gdb -q 2&>1".execute()
第二个猜测是,在工作和非工作情况下,可能值得检查show interactive mode的内容。如果它们不同,请尝试在执行任何其他操作之前关闭交互模式


第三种选择是使用GDB的日志记录功能编写日志文件集日志文件并设置登录,避免自己捕获输出。

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

我没有在这里列出它,因为我想保持它的简短,但我已经将stderr与stdout合并了,它也不在这里。我现在意识到,输出只是没有被GDB刷新!将显示另一个命令和输出。日志选项可以工作,但不包括发送到GDB的命令。您可以使用“设置跟踪”命令来获取它们。不完全相同,因为每个打印都以+为前缀,但足够接近。谢谢我已经考虑过了,但是想要一个对那些不熟悉脚本语言的人友好的日志文件。