出于单元测试的目的,我希望能够使用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重定向到一个文件并不会捕获它(仅:QEMU2.8.0-13监视器类型的“帮助”获取更多信息( QEMU ))。查看可用的qemu日志选项,据我所知,-d help没有提供任何内容。
编辑
一个恶意的解决方案是使用脚本来捕获终端会话:script --quiet --command <qemu-shell-script-wrapper>
发布于 2021-12-15 10:32:00
这不是一个上游QEMU,2.8也是相当老的,但希望与上游QEMU工作的相同的东西将在那里工作。
首先,假设您没有实际使用监视器,您可以通过删除“-nographic”和使用“-display”来摆脱输出的这一部分。(如果这是您想要的,那是很方便的,但有时单独指定所有内容并不那么令人困惑。)
其次,您说您使用的是半宿主输出,但是来宾的stdlib是否确实使用了对其but ()字符串输出的半托管,而不是对串行端口(UART)输出?无论哪种方式,输出都会出现在终端上,但是如何告诉QEMU将其重定向到其他地方,则会有所不同。(我怀疑它可能使用了UART输出,因为如果它使用的是半宿主输出,那么您尝试的stdout的重定向应该是有效的。)
如果来自客户的输出是通过串行端口输出的,那么您可以使用‘--serial’选项(最简单的是,发送到stdout的“stdio”,但您也可以执行更复杂的事情,比如发送到文件、管道或TCP套接字)来控制它的去向。如果它是通过半托管,那么你可以控制它去哪里使用'chardev=id‘子选项-半托管-配置。
https://stackoverflow.com/questions/70357970
复制相似问题