0

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

示例文件:

#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;
}

运行:

qemu-system-gnuarmeclipse --nographic --no-reboot \
  --board STM32F4-Discovery --mcu STM32F429ZI \
  --semihosting-config enable=on,target=native \
  --image <binary>

显示到控制台的是:

QEMU 2.8.0-13 monitor - type 'help' for more information
(qemu) This is some example text that I want to capture

此“示例文本”是在 QEMU 中生成的,因此将 stdout 重定向到文件不会捕获它(仅限:QEMU 2.8.0-13 监视器 - 键入“帮助”以获取更多信息 (qemu))。-d help就我所见,查看可用的 qemu 日志记录选项并没有提供任何东西。

编辑

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

4

1 回答 1

1

那不是上游 QEMU,而且 2.8 也很老了,但希望与上游 QEMU 一起工作的东西也能在那里工作。

首先,假设您实际上并没有使用显示器,您可以通过删除“--nographic”而不是使用“-display none”来摆脱那部分输出。(--nographic 同时做很多事情,包括“无图形显示”和“默认串行输出到终端,添加 QEMU 监视器并复用监视器和串行”等等。如果这就是您想要的,但有时单独指定所有内容不会令人困惑。)

其次,您说您使用的是半主机输出,但来宾的标准库是否肯定使用半主机作为其 puts() 字符串输出而不是串行端口 (UART) 输出?无论哪种方式,输出都会在终端上输出,但是您告诉 QEMU 将其重定向到其他地方的方式会有所不同。(我怀疑它可能正在使用 UART 输出,因为如果它使用的是半主机输出,那么您尝试的 stdout 重定向应该可以工作。)

如果来宾的输出是通过串行端口,那么您可以使用“-serial”选项控制它的去向(最简单的是,“-serial stdio”发送到标准输出,但您也可以做更复杂的事情,比如发送到文件、管道或 TCP 套接字。)。如果是通过半主机,那么您可以使用 -semihosting-config 的 'chardev=id' 子选项来控制它的去向。

于 2021-12-15T10:32:00.137 回答