为什么所有程序都被 Valgrind 分成 200 个基本块?以及如何划分?
1 回答
第一个问题
自从我使用 Valgrind 工具已经有一段时间了(甚至比这个问题还老),但如果有人仍然感兴趣,这就是我从记忆中挖掘出来的:
首先,区别:超级块与基本块有点不同。Valgrind 使用超级块,而不是基本块。超级块可以在任何时候退出,但基本块只会通过跑完它的末端而退出。
Valgrind 不会将程序分成 200 个超级块。我很确定它会将程序分解为不超过 200 个 IRStatements 的超级块(可能会也可能不会直接转换为指令)。
我很确定这样做的原因是为了提高翻译器的效率:至少对于当前版本的 Valgrind,我有理由确定它不会预先翻译你的整个程序。将程序翻译成它的 IR 格式既费时又耗费资源,因此翻译人员试图只翻译它需要的程序的大部分内容。它通过仅在第一次执行时翻译代码来做到这一点。
第二个问题
现在,关于你的第二个问题......我不完全确定你在问什么。如果你问“Valgrind 是如何决定如何划分程序的?”,那么答案是它的决定类似于编译器。它开始将程序转换为超级块,并在达到块限制大小或检测到从其他地方进入块的入口点(超级块和基本块只能有一个入口点)时启动一个新的超级块。
如果您的意思是“我可以更改 IRSB 超级块的大小吗?”,那么是的,您可以在工具初始化代码中将一个选项传回 Valgrind 来告诉它您想要什么大小的超级块(尽管我不知道'不记得是否可以将其增加到任意大小)。这些都没有在线记录,并且仅在文件本身中很少记录。您可以查看其他工具的源代码,以了解它们如何在初始化期间将配置选项传递给 Valgrind。这至少应该让您很好地了解要查看哪些标头以确定您需要将哪个选项传递回 Valgrind。