编写使用GDB测试 - 如何捕捉输出?(Writing tests that use GDB - h

2019-10-19 23:22发布

我想编写与GDB交互的测试,但我有麻烦捕获它的输出。 我想对于要生成一个日志文件,它看起来像什么会在终端被视为已测试是手工执行。 GDB被证明是非常顽固,当谈到然而捕捉它的输出。

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

我尝试使用的ProcessBuilder开始从Java GDB的过程,它大部分的作品,但打印报表的输出永远不会出现在标准输出,并且不能被捕获。 我想,如果期待的作品,那么我发动从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

Answer 1:

One possibility is that the GDB output is being dumped on standard error and you are only capturing standard output. You should be able to fix this with a redirect, something like this I think:

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

A second guess is that it may be worth checking what "show interactive-mode" says in the working and non-working cases. If they differ try "set interactive-mode off" before you do anything else.

A third option is to use GDB's logging facility to write the log file ("set logging file " and "set logging on") and avoid having to capture the output yourself.



Answer 2:

如果您的测试包括使用gdb进行调试实际的东西,而不是测试GDB本身,你应该考虑使用GDB / MI接口。



文章来源: Writing tests that use GDB - how to capture output?