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

标签 java groovy gdb expect

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

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

我尝试使用 ProcessBuilder 从 Java 启动 GDB 进程,它基本上可以工作,但 print 语句的输出永远不会出现在 stdout 上并且无法捕获。我想如果 Expect 有效,那么我会从 Java 启动 Expect 并让它与 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

最佳答案

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

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

第二个猜测是,可能值得检查“显示交互模式”在工作和非工作情况下的含义。如果它们不同,请在执行其他操作之前尝试“设置交互模式关闭”。

第三种选择是使用 GDB 的日志记录工具来写入日志文件(“设置日志记录文件”和“设置日志记录”)并避免自己捕获输出。

关于java - 使用 GDB 编写测试 - 如何捕获输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2321087/

相关文章:

gdb - 使用 boost::iostreams 时未找到警告消息 RTTI 符号

java - JPQL 语句不适用于引用

java - 将指定格式的文件读入ArrayList

java - 是否可以使函数返回 true、false 或对象列表?

java - 对象数组列表中的 If 语句和循环

grails - 如何更改 Grails 生成的输入字段的顺序

带有 optional 参数的 Groovy 闭包

xml - 使用 "envelop"创建 groovy xml - 在 xml 结构中间添加节点

linux - 查找共享库中变量的地址

python - 如何在 Python 中导入 'GDB'