我知道ltrace和strace工具分别跟踪库和系统调用,但是我我要问的是专门位于文件本身中的字节。自己跟踪确切的字节。我还发现,对于如此短的程序,它采样速度不够快。 oprofile似乎也有类似的问题。
我使用了
radare2生成了可执行文件的调用图,但是创建了完整的调用图,并且独立于任何参数/执行,
我想使用此工具比较两个二进制文件的执行,即显示./gcd 5 10和./gcd 128之间的执行差异24
是否存在这样的工具?
#1 楼
看来您需要的是指令跟踪器。英特尔提供的PIN是一种框架示例,可让您制作跟踪工具。它使用动态二进制工具来实现合理的速度,并且您可以使用该库附带的示例之一,而无需做任何改动。许多调试器还支持指令跟踪记录(通常通过软件步进每条指令,这很慢但通常很可靠)。有些甚至可能支持差分调试,该调试可记录多个执行并显示它们之间的差异。 。#2 楼
正如@IgorSkochinsky建议的那样,您可以使用动态二进制仪表(DBI)。PIN的一种替代方法是DynamoRIO。
已使用
drbuild.sh
构建了DynamoRIO,已编译gcd.c
,运行gcd
并生成了drcov.gcd.18958.0000.proc.log
和drcov.gcd.18960.0000.proc.log
,我们可以在运行一(2177)和两个(2183)的日志之间比较“ BB Table”字段,以立即查看更多基本块(计数由于我们在while()
中使用了gcd_iter()
,因此应该在第二轮执行。例如,module 0
包含gcd
二进制文件中的所有基本块。包含module[ 0]: 0x0000043b
的行表示遇到了module 0 start (0x08048000) + 0x0000043b
的基本块。从此cfg中,我们可以看到0x0804843b
是gcd_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
评论
software.intel.com/sites/landingpage/pintool/docs/71313/Pin / ...