2011-11-12 25 views
5

我想在C++中剖析一個dll插件。我可以訪問源代碼(作者/ mantainer)並可以修改它們(如果儀器需要)。 我沒有的是調用dll的主機程序的源代碼/符號/等。我只有構建插件所需的頭文件。 該DLL是在來自客戶端的操作時調用的。分析一個dll插件

進行分析代碼的最佳方法是什麼?將一個可執行文件「包裝」到dll中並不實用,因爲在插件中,我從主機調用某些函數,並且需要對這些路徑進行配置,所以包裝會扭曲性能。基倫約翰斯頓的評論後

編輯:理想我想掛接到加載的DLL就像調試器能夠(連接到正在運行的宿主進程,並根據需要在DLL中放置一個斷點的地方)。可能嗎?如果沒有,我會需要問一個問題要問爲什麼:-)

我使用的Visual Studio TFS版本爲AIX下相同的任務提供建議/答案2010

獎勵積分(啊,多環境的樂趣!)。

+0

您使用哪種分析器?你只是嘗試運行主機程序?如果您有插件的符號,它應該仍然可以工作。 –

+0

VS2010中內置的分析器。我會嘗試解開主機程序的啓動過程,但這並不容易,因爲它需要各種其他程序/連接。這不是一個簡單的foo.exe ...它需要我一點時間,所以我想檢查是否有某種方法可以「掛鉤」到加載的dll中,就像調試器能夠做到的那樣。 – Francesco

+1

在您的解決方案中爲您的dll啓用分析器,將所有程序樹複製到可執行文件夾中,或者使vs將dll放入程序文件夾。設置可執行文件名爲foo.exe並運行分析器... – neagoegab

回答

3

儘管有點煩人,但這是可能的。

  1. 部署您的插件DLL到主機應用程序需要它是
  2. 啓動主機應用程序,並驗證它是否使用外掛
  3. 創建一個新的性能會話
  4. 添加主機EXE作爲目標的會話步驟3
  5. 選擇採樣或儀器爲會話
  6. 啓動分析會話

在所有這些過程中,您的插件解決方案都會被加載,VS會自動爲您的插件找到符號。

+0

這似乎是我的想法。對於我來說,能夠(在步驟4中)將主機exe指定爲實際運行進程,而不用重新啓動它(指定命令行參數等)。我會盡快嘗試,但如果這個工程,你的是我尋找的答案:) – Francesco

1

不確定VS10,但在較舊的版本中,通過指定運行它的exe來調試dll。讓我們將問題分爲兩部分:1)找出你可能稱之爲「瓶頸」的地方,2)通過修復每個問題來測量整體加速度。

(2)很簡單吧?所有你需要的是一個外部計時器。

即將離開(1)。如果你像大多數人一樣,你認爲找到「瓶頸」不能在沒有精確計時的情況下完成。 並非如此,因爲大多數情況下,您需要修復以獲得最快加速的事情並不是您能夠以這種方式檢測到的事情。 它們不一定是錯誤的算法,或者慢函數或熱點。 他們分發的東西是由完全無辜的外觀設計良好的代碼完成的,如果以不同的方式編碼,就會出現巨大的加速機會。

Here's an example這是一個合理編寫的程序,其執行時間從48秒減少到20,17,13,10,7,4,2.1和最後1.1,經過8次迭代** 這是一個複合加速因子超過40倍。 你可以獲得的加速因子在每個不同的程序中都有所不同 - 一些可以減少,一些可以獲得更多,這取決於它們離最優的程度有多近。 如何做到這一點並不存在。 該方法是random pausing。 (這是使用探查器的替代方案,探查器可以測量各種事物,併爲您提供各種可能或不可能有用的線索,但它們不能可靠地告訴您問題所在)。

**加速每次迭代獲得的因子分別爲2.38,1.18,1.31,1.30,1.43,1.75,1.90,1.91。另一種方式是每次迭代縮短百分比時間:58%,15%,24%,23%,30%,43%,48%,48%。我從Profiler粉絲那裏得到了很大的幫助,因爲這種方法是手動的,但他們從不談論加速結果。 (也許這將改變。)

+0

感謝邁克,鏈接是非常有趣的,我感謝你的貝葉斯解釋(如此正式upvoted)。我一定會嘗試一下你的方法,它還有更多的優點可以跨平臺應用。 – Francesco

+0

@Francesco:很多人都知道這種方法。這個想法表明,可以修復某些事情以節省時間,但這些事情並非本地化爲例行程序或甚至是代碼行,但可以通過仔細查看示例快速找到,這一點在* [本文](http:///stackoverflow.com/questions/7916985/what-is-boilerplate-code-hot-code-and-hot-spots/7923574#7923574)*。 –

+0

@Francesco:如果你在統計上傾向於,它背後的原理也可以用beta,二項式或負二項分佈來解釋,但是你不需要知道它的用法。 –