使用PTRACE_SINGLESTEP计算进程的机器指令

时间:2009-09-03 20:55:12

标签: c linux debugging ptrace

在Linux机器上,我使用带有PTRACE_SINGLESTEP参数的ptrace来计算程序的机器指令数。我遵循了这篇文章:http://www.ncsu.edu/it/mirror/ldp/LDP/LGNET/81/sandeep.html

然而,结果对我来说似乎很奇怪。对于一个非常简单的程序,计算超过95000台机器指令。测试程序是

int main(void) { return 23; }

这里发生了什么?该文章的代码是错误的吗? (我看不出它有什么问题。)  如果没有,是什么导致这样一个简单的程序需要> 95000指令?

2 个答案:

答案 0 :(得分:5)

您正在编译的C程序已链接到C库。它包含程序执行开始的_start符号。此时,C库初始化自己并最终调用main。在main返回后,控件返回_start并且还有许多其他指令要执行并返回程序返回值。请注意,连续使用PTRACE_SINGLESTEP不会计算编译指令的数量。它会计算已执行指令的数量。这意味着在执行main之前,执行main之后以及退出main之后,将执行95k指令。

答案 1 :(得分:1)

这是由于所谓的“软件臃肿”。您必须初始化并最终确定stdio,甚至可能是一些流入标准C运行时的线程代码。如果你进一步阅读并描述它,你可能会发现究竟是什么。或者你可以阅读消息来源。

更新:实际上,后来我意识到你可能正在追踪动态链接器的操作,这需要做很多工作。我看到有人留下了这样的评论,所以我赞成了评论。如果你没有静态链接程序,那么我们原来的答案基本上都是错误的。