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