有许多静态和动态的仪器工具。 Soot是Java字节码的静态检测工具。 Pin和Valgrind是二进制文件的动态检测工具。
静态和动态检测工具的优缺点是什么?我认为静态检测工具在运行时性能方面更好,而动态工具则更强大。请在能力和表现方面进行比较。
另外,使用检测工具写LLVM传递有什么区别?
答案 0 :(得分:2)
我认为需要发现需要大量时间的代码,并且可以进行优化以节省时间。这与计时例程不同。
我对静态分析仪持怀疑态度,因为一切都取决于输入数据组合。
动态检测尝试测量函数的属性,例如:自身时间和总时间,绝对值,平均值和百分比。还要调用计数,以及每个例程在调用图中的作用。
动态仪器(la gprof)几十年来一直是事实上的标准,但它远不是硬道理。首先,重要的是要意识到它给你的大多数统计数据都缺少原始需求。
这些天(恕我直言)你需要一个采样分析器来对调用堆栈进行采样,而不仅仅是程序计数器。它应该在挂钟时间上进行采样,而不仅仅是CPU时间。不需要以高频率抽取样品。当应用程序等待用户输入时,它应该禁止采样。它应该在行或指令级别提供信息,而不仅仅是功能级别。它应该为一行代码提供的最重要的统计数据是包含它的样本的百分比,因为这是对该行进行优化时可以保存的最直接的时间度量。
一些剖析器可以做到这一点,特别是Oprofile和RotateRight / Zoom。
答案 1 :(得分:2)
静态检测的优点是分析不依赖于输入。分析发生在原始代码上,包括代码的所有路径。完全覆盖。这种类型的检测通常会重写准备执行的二进制文件,而无需在运行时进行其他过程。这也意味着代码将快速运行,唯一的开销来自注入的代码。静态检测的缺点是由于缺乏运行时信息而导致的详细分析,因此,有时很难实现您的目标。
另一方面,动态检测确实包含代码运行期间的每个细节和信息。在大多数情况下,执行动态检测的工具很容易编写。另一方面,由于执行路径取决于给定的输入,因此无法实现完整的代码覆盖。此外,需要附加外部过程并使用原始过程的事实会使事情变得更慢。
AFAIC,LLVM传递用于静态检测,因为生成的代码是在编译时生成的,并且已经写入最终的二进制文件中,并且肯定包含了静态检测技术的所有优点和缺点。
总而言之,这是你需要的问题。你应该为你的工作选择合适的工具。