java 程序 gdb_关于Java:使用GDB的笔试-如何捕获输出?

我正在尝试编写与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

Program exited normally.

(gdb) quit

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

我已经考虑过了,但是想要一个对不熟悉脚本语言的人友好的日志文件。

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

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

第二个猜测是,可能需要检查在工作和非工作情况下"显示交互模式"的内容。 如果它们不同,则在执行任何其他操作之前,请尝试"将交互模式设置为关闭"。

第三种选择是使用GDB的日志记录工具来编写日志文件("设置日志文件"和"设置日志记录"),而不必自己捕获输出。

我没有在这里列出它,因为我想简短些,但是我已经将stderr与stdout合并了-它也不在那里。 我现在意识到,尽管输出只是没有被GDB刷新! 另一个命令和输出出现。 日志记录选项有效,但不包括发送到GDB的命令。 您可以使用" set trace-commands on"来获取它们。 不完全相等,因为每个打印都以" +"为前缀,但足够接近。 谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值