我已经开发了一个用于跟踪特定机器级指令(cmp,...)的英特尔拼接工具。一个给定的程序。
现在我发现我应该将这个任务切换到QEMU,但实际上我之前没有开发基于QEMU的工具的经验,事实上我也没有找到太多关于这方面的文档。
那么,如何使用QEMU跟踪特定的机器指令呢?
我真的应该将其开发为QEMU的TCG插件吗?还是有其他方法可以做到这一点?
谢谢!
附言:我发现这段代码是作为QEMU TCG插件进行指令级跟踪的:
TCGTemp *args[1];
TCGv_i64 tcgv_str;
size_t size = MAX_PRINT_SIZE*sizeof(char);
size_t left;
char *str = g_malloc(size);
char *ptr;
size_t count;
int i;
ptr = str;
left = size;
count = snprintf(ptr, left,
"0x%"PRIx64":\t %s\t %s\t //",
insn->address,
insn->mnemonic,
insn->op_str);
for (i = 0; i < insn->size && count < left; i++) {
left -= count;
ptr += count;
count = snprintf(ptr, left, " %02x", insn->bytes[i]);
}
if (count < left) {
left -= count;
ptr += count;
snprintf(ptr, left, "\n");
}
snprintf(str + size - 5, 5, "...\n");
tcgv_str = tcg_const_i64((uint64_t)(intptr_t)str);
args[0] = tcgv_i64_temp(tcgv_str);
tcg_gen_callN(write_str, TCG_CALL_DUMMY_ARG, 1, args);
tcg_temp_free_i64(tcgv_str);是否有可能将TCG插件的整个代码合并到QEMU的基础中,以便在运行来宾系统时可以将其用作QEMU的补丁?
发布于 2020-11-27 23:50:38
是的,如果你需要基于QEMU来做这件事,TCG插件是你最好的选择。唯一的另一种方法最终会试图修改QEMU自己的源代码,这将是痛苦的,而且从长远来看,这不是一个可维护的解决方案。
值得检查的是,使用QEMU是否是一个硬需求-- QEMU的主要关注点是快速运行来宾代码,而且从历史上看,它并不真正支持来宾代码的“插装”-- TCG插件是最近才添加的。根据您所做的工作,您可能还希望评估DynamoRIO或valgrind。
https://stackoverflow.com/questions/65036553
复制相似问题