2012-01-14 67 views
1

我遇到了一些問題,通過我的xperf跟蹤獲取完整調用堆棧。這是在Win7 64位電腦上。在更高層次上,我有一個exe文件加載了多個dll,這也完成了大部分工作。所有的pdb文件都在一個目錄中,並且我在可執行代碼中獲得有效的符號和調用堆棧,所以我很確定我的符號路徑設置正確。xperf callstack跟蹤,特定於dll

只要我的exe調用其中一個加載的dll,我就失去了調用堆棧信息,堆棧列顯示plugin_name.dll!?,這些擴展後會調用它自己。權重選項卡顯示很高的百分比(50-90%)和較高的計數,但我無法獲得堆棧的任何實際函數調用。例如:

Process, Stack, Module, Function, Weight, % Weight, Count, TimeStamp 
, |  kernel32.dll!BaseThreadInitThunk, , , 59067.075556, 73.29, 59075, 
, |  |- plugin_name.dll!?, , , 45036.186642, 55.88, 45042, 
, |  |  plugin_name.dll!?, , , 45036.186642, 55.88, 45042, 

基於這些,

http://blogs.msdn.com/b/pigscanfly/archive/2009/08/06/stack-walking-in-xperf.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ff191014(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ff191014.aspx

這似乎表明,xperf

  • 」 ......不知道是什麼EXEC無圖像的地址爲「
  • 」...超過最大堆棧深度「

造成這種情況的可能原因是我發現無論是在FPO(幀指針優化)打開(我已明確與/ Oy-禁用,即使它們不應該是),或超過最大堆棧深度,我不知道如何確定這是我打或不打。

不能看到在dll中花費的時間,我無法獲得非常有用的信息,所以我想弄清楚發生了什麼。

有沒有人有任何閱讀或嘗試的建議? stackwalk是否有任何限制,我錯過了?是否有特殊的符號設置,特定於dll中的調用堆棧?

+0

當然,這是一個老問題 - 我仍然覺得這是與WPA一個問題,我的dll的符號,有時無法加載,所以我想注意,確保所有符號路徑都指向c:\(對於本地和緩存位置),我運行我想從c:(通過mklink)配置文件並且我也不卸載我的dll似乎有所幫助。將更新如果更改 – g3cko 2016-07-27 19:05:30

回答

0

嘗試以下,從here: 禁用分頁執行

爲了追蹤到在64位Windows上工作,你需要設置disablepagingexecutive調整註冊表項。這告訴操作系統不要將內核模式驅動程序和系統代碼分頁到磁盤,這是使用xperf獲取64位調用堆棧的先決條件,因爲64位堆棧依賴於可執行映像中的元數據,並且在某些情況下不允許xperf堆棧行走代碼觸摸分頁出頁面。從提升的命令提示符處運行以下命令將爲您設置此註冊表項。

REG ADD "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" -v DisablePagingExecutive -d 0x1 -t REG_DWORD -f 

設置此註冊表項後,您需要重新啓動系統,然後才能錄製調用堆棧。設置此標誌意味着Windows內核將更多頁面鎖定到RAM中,因此這可能會消耗約10 MB的額外物理內存。

+0

感謝您的答覆,不幸的是,我已經有了這個設置。有一件事我注意到,這似乎很奇怪,我的DLL沒有緩存到符號目錄(c:\ symbols)。我的_NT_SYMBOL_PATH包含pdb所在的目錄,並且使用xperf -symbols -i trace.etl似乎也沒有幫助。 – g3cko 2013-01-25 23:44:40