【问题标题】:Finding very similar program executions寻找非常相似的程序执行
【发布时间】:2009-05-11 22:25:54
【问题描述】:

我想知道它是否可能/有人知道那里有任何工具来比较两个相关程序的执行(例如,课堂作业),看看它们有多相似。例如,不是比较函数的名称,而是比较它们如何使用系统调用。一个愚蠢的情况是测试一个 C 字符串是否在多个 one case 一个单独的程序中打印为(参见下面的示例)。

printf("%s",str)

或者作为

for (i=0;i<len;i++) printf("%c",str[i]);

我对此没有过多考虑,但我想 strace / ltrace(甚至可能是 oprofile)将是一个很好的起点。特别是,这适用于 UNIX C / C++ 程序。

谢谢。

【问题讨论】:

  • 为什么不只检查汇编代码的分支数量等。

标签: c++ c unix


【解决方案1】:

如果您可以访问这两个程序的源代码,您可以构建函数图(每个函数都是一个节点,如果 A 调用 B(),则从 A 到 B 有一条边),并计算一些图相似度指标。这将捕获通过重命名和重组生成的源代码副本。

【讨论】:

    【解决方案2】:

    最初的想法是使用 ltrace 和 strace 来记录调用,然后在日志上使用 diff。这显然只会涵盖系统调用的库。如果您需要更精细的日志记录,oprofile 可能会有所帮助。

    如果您有权访问源代码,则可以通过使用分析信息编译代码来检测代码,然后在运行后解析 gcov 输出。如果您的代码没有根据外部数据/状态采取不同的路线,那么纯静态源代码分析可能就足够了。

    【讨论】:

      【解决方案3】:

      我认为你可以使用 valgrind 来做这种事情。

      更细粒度的版本(取决于对程序源的访问权限以及您在比较方面的确切要求)将使用 kprobes。

      Kernel Dynamic Probes (Kprobes) 为内核模块提供了一个轻量级的接口来植入探针和注册相应的探针处理程序。探针是一个自动断点,它在执行(内核空间)模块中动态植入,无需修改其底层源。探针旨在用作需要对系统造成最小干扰的临时服务辅助工具。在不希望使用交互式调试器的生产环境中特别提倡使用它们。 Kprobes 在测试和开发环境中也有很大的适用性。在测试期间,故障可能由探测模块注入或模拟。在开发中,可以很容易地插入调试代码(例如 printk),而无需重新编译到被测模块。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 1970-01-01
        • 2015-06-27
        • 2011-12-12
        • 1970-01-01
        相关资源
        最近更新 更多