给定一个二进制可执行文件(在这种情况下,是找到2个数字的gcd的已编译C文件),有没有一个工具可以对该文件的执行进行概要分析,并可以生成该执行的某种调用图,特别是执行顺序指令/字节被调用/访问(即该文件中指令/字节的位置列表)?

我知道ltrace和strace工具分别跟踪库和系统调用,但是我我要问的是专门位于文件本身中的字节。自己跟踪确切的字节。我还发现,对于如此短的程序,它采样速度不够快。 oprofile似乎也有类似的问题。

我使用了
radare2生成了可执行文件的调用图,但是创建了完整的调用图,并且独立于任何参数/执行,

我想使用此工具比较两个二进制文件的执行,即显示./gcd 5 10和./gcd 128之间的执行差异24

是否存在这样的工具?

评论

software.intel.com/sites/landingpage/pintool/docs/71313/Pin / ...

#1 楼

看来您需要的是指令跟踪器。英特尔提供的PIN是一种框架示例,可让您制作跟踪工具。它使用动态二进制工具来实现合理的速度,并且您可以使用该库附带的示例之一,而无需做任何改动。许多调试器还支持指令跟踪记录(通常通过软件步进每条指令,这很慢但通常很可靠)。有些甚至可能支持差分调试,该调试可记录多个执行并显示它们之间的差异。 。

#2 楼

正如@IgorSkochinsky建议的那样,您可以使用动态二进制仪表(DBI)。

PIN的一种替代方法是DynamoRIO。

已使用drbuild.sh构建了DynamoRIO,已编译gcd.c,运行gcd并生成了drcov.gcd.18958.0000.proc.logdrcov.gcd.18960.0000.proc.log,我们可以在运行一(2177)和两个(2183)的日志之间比较“ BB Table”字段,以立即查看更多基本块(计数由于我们在while()中使用了gcd_iter(),因此应该在第二轮执行。例如,module 0包含gcd二进制文件中的所有基本块。包含module[ 0]: 0x0000043b的行表示遇到了module 0 start (0x08048000) + 0x0000043b的基本块。从此cfg中,我们可以看到0x0804843bgcd_iter()函数中的第一个基本块。否则,我们跳到gcd_iter()。前两个运行的日志(其中所有参数均为正)与该期望保持一致。 。

$ ./drbuild.sh  # build script (below)
$ gcc gcd.c -o gcd

# run one
$ $ ./dynamorio/build/bin32/drrun -t drcov -dump_text -- ./gcd 5 10
5

$ ls  # so we know which log is from our first run
drbuild.sh  drcov.gcd.18958.0000.proc.log  dynamorio  gcd  gcd.c

# run two
$ $ ./dynamorio/build/bin32/drrun -t drcov -dump_text -- ./gcd 128 24
8