2010-06-02 61 views
5

我有一個程序,我想用gprof進行配置文件。問題(表面上)是它使用套接字。所以我得到的東西是這樣的:使用gprof與套接字

::select(): Interrupted system call 

我打這個問題而回,放棄了,並繼續前行。但我真的很想能夠剖析我的代碼,如果可能,請使用gprof。我能做什麼?有沒有我錯過的gprof選項?套接字選項?在這些類型的系統調用中gprof是完全無用的嗎?如果是這樣,是否有一個可行的選擇?

編輯:平臺:

  • 的Linux 2.6(x64)的
  • GCC 4.4.1
  • gprof的2.19
+0

我想你也應該提到你的平臺:操作系統,編譯器,gprof的版本等 – 2010-06-02 12:52:27

+2

我發現這篇文章:也許這是一些使用的: http://unix.derkeiler.com/Newsgroups/comp.unix .programmer/2004-03/0938.html – LoudNPossiblyWrong 2010-06-02 12:57:12

+0

您是否嘗試過使用valgrind/kcachegrind來配置文件?我更喜歡它gprof。 – 2010-06-02 12:57:24

回答

5

插座代碼需要處理中斷系統調用不管profiler如何,但在profiler下是不可避免的。這意味着有類似的代碼。

if (errno == EINTR) { ... 

每次系統調用後。

看一看,例如,here爲背景。

+0

太好了,謝謝。後續:http://stackoverflow.com/questions/2958114/handling-eintr-with-goto – 2010-06-02 13:28:32

1

gprofhere's the paper)是可靠的,但它only was ever intended to measure changes,甚至爲此,它只測量CPU綁定的問題。它從來沒有被宣傳爲有用的定位問題。這是其他人在其上分層的想法。

考慮this method

另一個不錯的選擇,如果你不介意花一些錢,是Zoom

加:如果我可以給你舉個例子。假設你有一個調用層次結構,其中Main調用了一些次數,A調用了一定次數的B,B調用了C次數,而C用一個套接字或文件等待了一些I/O,而這基本上都是該計劃的確如此。現在,進一步假設每個例程調用下一個例程的次數比實際需要的次數多25%。由於1.25^3約爲2,這意味着整個程序需要兩倍的時間才能運行。

首先,因爲所有的時間都花在等待I/O上,所以gprof將不會告訴你這段時間是如何度過的,因爲它只看「運行」時間。

二,假設(僅供參數)確實計算I/O時間。它可以給你一個通話圖,基本上說每個程序都佔用了100%的時間。這是什麼告訴你的?沒有比你已經知道的更多。

但是,如果你採取少量的堆棧樣本,你會看到每一個例程調用下一個代碼的行。 換句話說,它不只是給你一個大概的百分比時間估計,它是指向你昂貴的代碼特定的代碼行。 你可以看看每一行代碼,並詢問是否有辦法做到這一點更少。假設你這樣做,你會得到2加速因子。

人們通過這種方式獲得了很大的因素。根據我的經驗,通話等級的數量可以輕鬆達到30或更多。每個電話似乎必要的,直到你問是否可以避免。即使是少量的可避免的呼叫,也可以在很多層上產生巨大的影響。