有许多静态和动态插装工具。Soot是一个用于Java字节码的静态插装工具。Pin和Valgrind是用于二进制文件的动态检测工具。
静态和动态检测工具的优缺点是什么?我认为静态工具在运行时性能方面更好,而动态工具更强大。请在能力和表现方面对他们进行比较。
另外,使用插装工具与编写LLVM pass有什么不同?
发布于 2010-02-04 00:52:40
我假设需要发现需要花费大量时间的代码,并且您可以优化以节省时间。这是一个与仅仅定时例程不同的目标。
我对静态分析器持怀疑态度,因为一切都依赖于输入数据的混合。
动态检测尝试测量函数的属性,例如:自身时间和总时间、绝对时间、平均时间和百分比。还有调用计数,以及每个例程在调用图中的角色。
动态插装(类似于)几十年来一直是事实上的标准,但它还远未成为定论。首先,重要的是要认识到,它给你的大多数统计数据在你最初的需求方面都没有切中要害。
现在(IMHO)你需要一个采样分析器来采样调用堆栈,而不仅仅是程序计数器。它应该采样挂钟时间,而不仅仅是CPU时间。样品不需要以高频率提取。它应该在应用程序等待用户输入时禁止采样。它应该提供行或指令级别的信息,而不仅仅是函数级别的信息。它应该为一行代码提供的最重要的统计数据是包含它的样本的百分比,因为这是如果该行优化可以节省的时间的最直接度量。
一些分析器可以做到这一点,特别是Oprofile和RotateRight/Zoom。
发布于 2015-08-23 21:58:20
静态插装的优点是分析不依赖于输入。分析发生在原始代码上,并包括代码的所有路径。全面覆盖。这种类型的指令插入通常会重写准备好执行的二进制文件,而不需要在运行时使用另一个进程。这也意味着代码将快速运行,唯一的开销来自注入的代码。静态插装的缺点是由于缺乏运行时信息而导致的分析不详细,因此,有时很难实现您的目标。
另一方面,动态检测确实包含了代码运行时的每一个细节和信息。在大多数情况下,执行动态检测的工具都很容易编写。另一方面,由于执行路径依赖于给定的输入,无法实现完整的代码覆盖。此外,需要一个外部进程来连接和检测原始进程的事实也会使事情变得更慢。
AFAIC、LLVM通道用于静态插装,因为生成的代码是在编译时生成的,并且已经在最终的二进制文件中编写,并且肯定包括静态插装技术的所有优点和缺点。
总而言之,这是你需要什么的问题。你应该为你的工作选择合适的工具。
https://stackoverflow.com/questions/2038625
复制相似问题