我希望能够生成一个通信/调用图,其中包含有关函数之间传递的数据量的信息。
所以例如:
function1()-----> [对象* ptr] ---->函数2()
表示函数1将指向对象的指针传递给函数2(反之亦然)。但是,如果* ptr指向一个1MB的对象(比方说)。然后图表应该如下:
function1()----> [对象* ptr :: 1MB] ----->函数2()
这将使我们粗略地了解如何(以及数据的类型/大小/格式)传递。看起来像:
我可以通过使用gprof profiling和gprof2dot脚本获得类似于(2)的图形,但是它的输出仅显示cpu usage%。我想看看它们之间传递的数据量。
是否有可以提供此功能的工具(开源/商业),或者您是否知道可用于获取此信息的工具组合?
(我正在考虑结合Valgrind + gprof的分析,但想知道是否有更直接的方法..
非常感谢!
答案 0 :(得分:1)
您需要一个处理函数指针的调用图。
使用它,您需要识别数据流,例如,在调用图的元素之间传递的值。对于标量值,标量的大小非常明显。对于指针值,指针大小可能相对明显,但流向被调用函数的数据量取决于指针被取消引用的数量,以及取消引用处理了多少数据。为此,如果你有一个“指向T的指针”并且指针被引用来获取“整个值”,那么你需要的大小是sizeof(T)。如果T是复合类型,则“p-> q”的访问具有T.q.的大小。因此,如果要静态收集此数据,则需要程序中的所有类型信息。
为此,您需要一个C解析器,名称和类型解析,控制和数据流分析。你不能用“只是一个C解析器”来做到这一点。
您可以使用GCC或Clang或使用我们的DMS等工具获取此信息。我的信念是从海湾合作委员会获取这些信息并不容易;它被设计为编译器,而不是分析工具。 Clang听起来更容易使用(我没有个人经验); DMS专为此类任务而设计,但人们的意见可能会有所不同。
您还需要能够构建调用图,然后重新运行每个模块的数据流。我认为这对海湾合作委员会来说很难;它希望一次只编译一个编译单元。 Clang我认为可以同时处理多个编译单元。 DMS可以,我们已经构建了带有点分析的调用图,用于分析2600万行的单个负载图像。
无论您选择哪种方式,设置工具来提取您想要的内容都是相当公平的练习。 [你会怎么做答案?]