2009-09-03 17 views
4

來計算進程的機器指令,我正在使用ptrace和PTRACE_SINGLESTEP參數來計算程序的機器指令數量。我跟着這篇文章:http://www.ncsu.edu/it/mirror/ldp/LDP/LGNET/81/sandeep.html在Linux機器上使用PTRACE_SINGLESTEP

但是,結果對我來說似乎很奇怪。對於一個非常簡單的程序,計算了超過95000條機器指令。測試程序是

int main(void) { return 23; } 

這是怎麼回事?文章中的代碼是否錯誤? (我看不出有什麼問題。) 如果不是,那麼導致這樣一個簡單程序需要> 95000條指令的原因是什麼?

+2

嘗試靜態鏈接您的程序,以避免動態鏈接程序的運行時開銷。 – mark4o 2009-09-03 23:31:41

+0

文章鏈接被破壞... – Thilo 2014-05-01 05:01:40

回答

5

您正在編譯的C程序鏈接到C庫。它包含程序執行開始的_start符號。此時,C庫自行初始化並最終調用main。在main返回後,控制流回到_start,並且有一堆其他指令可以執行並返回程序返回值。請注意,連續使用PTRACE_SINGLESTEP不會計算已編譯指令的數量。它計算執行指令的數量。這意味着在輸入main之前執行95k指令,執行main時以及退出main之後執行。

1

這是由於所謂的「軟件膨脹」。你必須初始化並完成stdio,甚至可能有一些線程代碼泄漏到標準C運行時。如果你進一步閱讀和簡介,你可能會發現究竟是什麼。或者你可以只讀源文件。

更新:實際上,後來我意識到你可能一直在追蹤動態鏈接器的操作,它有很多工作要做。我看到有人留下了這樣的評論,所以我提出了評論。如果你沒有靜態鏈接程序,那麼我們原來的兩個答案基本上都是錯誤的。