簡體   English   中英

分析dll插件

[英]Profiling a dll plugin

我想在C ++中分析一個dll插件。 我可以訪問源(作為作者/管理者),並且可以修改它們(如果需要檢測)。 我所沒有的是正在調用dll的宿主程序的源代碼/符號/ etc。 我只有構建插件所需的標頭。 該dll是在客戶端采取措施后調用的。

進行代碼概要分析的最佳方法是什么? 將可執行文件“包裝”到dll周圍是不現實的,並且它沒有用,因為在插件中,我從主機調用某些函數,並且我需要分析這些路徑,因此包裝器會使性能降低。

在Kieren Johnston的評論之后進行編輯:理想情況下,我想像調試器能夠鈎住加載的dll(附加到正在運行的主機進程,並根據需要在dll中的某個位置放置斷點)。 可能嗎? 如果沒有,我將需要再問一個問題:-)

我正在使用Visual Studio 2010的TFS版本。

獎勵積分,用於在AIX下為同一任務提供建議/答案(啊,多種環境的樂趣!)。

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

  1. 將插件DLL部署到主機應用程序需要的位置
  2. 啟動您的主機應用程序,並驗證它是否正在使用您的插件
  3. 創建一個新的性能會議
  4. 從步驟3開始,將主機EXE添加為會話中的目標
  5. 選擇會話的采樣或檢測
  6. 啟動分析會話

在此過程中,請始終保持插件解決方案的加載狀態,VS會自動找到該插件的符號。

不確定VS10,但在較舊的版本中,您可以通過指定用於運行的exe來調試dll。

讓我們將問題分為兩個部分:1)定位可能被稱為“瓶頸”的部分,以及2)通過修復每個問題來衡量整體加速速度。

(2)很容易吧? 您需要的只是一個外部計時器。

剩下(1)。 如果您像大多數人一樣,則認為如果沒有程序各部分的精確計時,就不可能找到“瓶頸”。 並非如此,因為大多數時候您需要修復才能獲得最大加速的東西並不是您可以通過這種方式檢測到的東西。 它們不一定是錯誤的算法,緩慢的功能或熱點。 它們是由看起來完美無瑕的精心設計的代碼完成的分布式工作,如果以不同的方式進行編碼,恰好會提供巨大的加速機會。

這是一個示例 ,其中編寫合理的程序經過8次迭代后,其執行時間從48秒減少到20、17、13、10、7、4、2.1,最后是1.1,**這是40倍以上的復合加速因子。 在每個不同的程序中,可以得到的加速因子都不一樣-有些可以減少,有些可以增加,這取決於它們與最佳狀態的接近程度。 如何執行此操作沒有任何奧秘。 該方法是隨機暫停 (這是使用探查器的替代方法。探查器可以測量各種事物,並為您提供各種線索,這些線索可能會或可能不會有所幫助,但它們並不能可靠地告訴您問題出在哪里。)

**每次迭代獲得的加速因子分別為2.38、1.18、1.31、1.30、1.43、1.75、1.90、1.91。 另一種表達方式是每次迭代減少的時間百分比:58%,15%,24%,23%,30%,43%,48%,48%。 我從探查器迷那里很難,因為該方法是如此手動,但他們從未談論提速結果。 (也許那會改變。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM