Llvm 静态和动态仪表的优点/缺点

Llvm 静态和动态仪表的优点/缺点,llvm,valgrind,instrumentation,soot,Llvm,Valgrind,Instrumentation,Soot,有许多静态和动态仪器工具。烟尘是Java字节码的静态检测工具。Pin和Valgrind是二进制文件的动态检测工具 静态和动态仪表工具的优缺点是什么?我认为静态工具在运行时性能方面更好,而动态工具更强大。请比较他们的能力和表现 另外,使用插装工具与编写LLVM过程有什么区别?我假设需要的是发现花费大量时间的代码,并且可以优化以节省时间。这是一个不同于常规计时的目标 我对静态分析器持怀疑态度,因为一切都取决于输入数据的混合 动态检测尝试测量函数的属性,例如:自时间和总时间、绝对值、平均值和百分比。还

有许多静态和动态仪器工具。烟尘是Java字节码的静态检测工具。Pin和Valgrind是二进制文件的动态检测工具

静态和动态仪表工具的优缺点是什么?我认为静态工具在运行时性能方面更好,而动态工具更强大。请比较他们的能力和表现


另外,使用插装工具与编写LLVM过程有什么区别?

我假设需要的是发现花费大量时间的代码,并且可以优化以节省时间。这是一个不同于常规计时的目标

我对静态分析器持怀疑态度,因为一切都取决于输入数据的混合

动态检测尝试测量函数的属性,例如:自时间和总时间、绝对值、平均值和百分比。还有调用计数,以及每个例程在调用图中的角色

几十年来,动态仪表(a la)一直是事实上的标准,但它还远远不是最后一句话。首先,重要的是要认识到,它提供给你的大多数统计数据都没有抓住你最初需要的重点

如今(IMHO),您需要一个采样探查器来采样调用堆栈,而不仅仅是程序计数器。它应该采样墙上的时钟时间,而不仅仅是CPU时间。样品不需要以高频率抽取。当应用程序等待用户输入时,它应该抑制采样。它应该为您提供行或指令级别的信息,而不仅仅是功能级别的信息。它应该为一行代码提供的最重要的统计数据是包含它的样本的百分比,因为这是对该行进行优化后可以节省的时间的最直接度量


一些分析器可以做到这一点,尤其是Oprofile和RotateRight/Zoom。

静态仪器的优点在于分析不依赖于输入。分析发生在原始代码上,包括代码的所有路径。全覆盖。这种类型的插装通常重写二进制文件,以便在运行时无需另一个进程即可执行。这也意味着代码将运行得很快,唯一的开销来自注入的代码。静态检测的缺点是没有详细的分析,这是由于缺少运行时信息造成的,因此,有时很难实现您的目标

另一方面,动态检测确实包括代码运行期间的每个细节和信息。在大多数情况下,执行动态检测的工具很容易编写。另一方面,由于执行路径依赖于给定的输入,因此无法实现完全的代码覆盖。还有一个事实是,需要附加一个外部过程,并使用原始过程,这会使事情变得更慢

在AFAIC中,LLVM过程用于静态检测,因为生成的代码是在编译时生成的,并且已经用最终二进制文件编写,并且肯定包含了静态检测技术的所有优点和缺点


总之,这是一个你需要什么的问题。你应该为你的工作选择合适的工具。

这个答案主要是关于探查器的,它可以为你提供程序运行时间的详细信息。评测只是检测程序的一个用例。@Karmastan:谢谢。通常,发现性能和内存问题是主要关注点。回答说,这是基于性能问题。我可以看到人们可能想要回答与正确性相关的其他类型的问题。