首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获QEMU半承载I/O

捕获QEMU半承载I/O
EN

Stack Overflow用户
提问于 2021-12-15 03:02:09
回答 1查看 324关注 0票数 0

出于单元测试的目的,我希望能够使用qemu运行一个简单的二进制文件,并捕获它的输出。

样本文件:

代码语言:javascript
复制
#include <stdio.h>
#include <stdint.h>

static void qemu_exit() {
  register uint32_t r0 __asm__("r0");
  r0 = 0x18;
  register uint32_t r1 __asm__("r1");
  r1 = 0x20026;
  __asm__ volatile("bkpt #0xAB");
}

int main(void) {
  puts("This is some example text that I want to capture");

  qemu_exit();

  return 0;
}

与以下人一起奔跑:

代码语言:javascript
复制
qemu-system-gnuarmeclipse --nographic --no-reboot \
  --board STM32F4-Discovery --mcu STM32F429ZI \
  --semihosting-config enable=on,target=native \
  --image <binary>

显示在控制台上的内容如下:

代码语言:javascript
复制
QEMU 2.8.0-13 monitor - type 'help' for more information
(qemu) This is some example text that I want to capture

这个“示例文本”是在QEMU中生成的,因此将stdout重定向到一个文件并不会捕获它(仅:QEMU2.8.0-13监视器类型的“帮助”获取更多信息( QEMU ))。查看可用的qemu日志选项,据我所知,-d help没有提供任何内容。

编辑

一个恶意的解决方案是使用脚本来捕获终端会话:script --quiet --command <qemu-shell-script-wrapper>

EN

回答 1

Stack Overflow用户

发布于 2021-12-15 10:32:00

这不是一个上游QEMU,2.8也是相当老的,但希望与上游QEMU工作的相同的东西将在那里工作。

首先,假设您没有实际使用监视器,您可以通过删除“-nographic”和使用“-display”来摆脱输出的这一部分。(如果这是您想要的,那是很方便的,但有时单独指定所有内容并不那么令人困惑。)

其次,您说您使用的是半宿主输出,但是来宾的stdlib是否确实使用了对其but ()字符串输出的半托管,而不是对串行端口(UART)输出?无论哪种方式,输出都会出现在终端上,但是如何告诉QEMU将其重定向到其他地方,则会有所不同。(我怀疑它可能使用了UART输出,因为如果它使用的是半宿主输出,那么您尝试的stdout的重定向应该是有效的。)

如果来自客户的输出是通过串行端口输出的,那么您可以使用‘--serial’选项(最简单的是,发送到stdout的“stdio”,但您也可以执行更复杂的事情,比如发送到文件、管道或TCP套接字)来控制它的去向。如果它是通过半托管,那么你可以控制它去哪里使用'chardev=id‘子选项-半托管-配置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70357970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档