找到非常相似的程序执行

时间:2009-05-11 22:25:54

标签: c++ c unix

我想知道它是否可能/任何人都知道有任何工具可以比较两个相关程序的执行情况(例如,类的分配),看看它们有多相似。例如,不要比较函数的名称,而是如何使用系统调用。一个愚蠢的例子就是测试C字符串是否打印为(见下面的例子),而不是一个案例一个单独的程序。

printf("%s",str)

或作为

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

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

感谢。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

  

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