簡體   English   中英

如何暫時停止WPF框架元素的優化?

[英]How to temporarily stop optimisation of WPF framework elements?

我正在逐步檢查WPF源代碼,以調試自己的代碼中的某些問題。 我有源代碼和pdb(我使用dotpeek作為符號服務器,所以我有完整的pdbs和源代碼),我可以毫無問題地進入WPF代碼。 我感興趣的模塊是PresentationFramework和System.Xaml。 調試經驗是可怕的,因為對框架模塊進行了優化(通常是一件好事!)。

我的理解是,它們在安裝時已被VS或其他工具與ngen.exe預先連接在一起,這引起了混淆。

從本機映像緩存中卸載.NET Framework元素以改善調試

據我了解,我可以使用ngen.exe(從Visual Studio文件夾啟動的Developer Command Prompt中)卸載本機映像文件。 例如...

ngen uninstall PresentationFramework
Uninstalling assembly PresentationFramework, Version=3.0.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=msil
Uninstalling assembly PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Uninstalling assembly PresentationFramework, Version=4.0.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=msil

我相信,這將迫使C#編譯器還原為MSIL版本,並在運行時JIT對其進行編譯。 我還假設自己可以禁用運行時JIT優化,這就是獲得良好調試體驗的方式。
但是,卸載目標本機映像證明很麻煩。 Ngen會這樣做,但是就調試經驗而言,它沒有任何作用。

當我再次嘗試卸載相同的模塊時,系統會通知我未安裝它們-這很令人鼓舞-但我還會獲得依賴於它們的文件,很多dll和exe文件以及一些本機映像文件的列表(大約十個)和以下消息...

You may need to uninstall these assembly roots in order to delete the native image for PresentationFramework
Error: The specified assembly is not installed.

因此,我假設我需要找到這十個文件的根目錄並開始從此處卸載所有文件。 如果存在大量依賴關系,這可能很快就會失控。

禁用特定MSIL模塊的JIT優化

假設我可以得到未優化的模塊,以抑制JIT優化,我將ini文件添加到與要逐步執行的模塊相同的文件夾中,例如,在C:\\Windows\\Microsoft.NET\\assembly\\GAC_MSIL\\PresentationFramework\\v4.0_4.0.0.0__31bf3856ad364e35我有

PresentationFramework.ini

[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

在“工具/選項/調試/常規/”中,我禁用了“啟用源服務器支持”,並啟用了“在模塊加載時抑制JIT優化”。

在“項目選項”中,“構建”部分禁用了“優化”代碼,在“構建/高級”中也將“調試”信息設置為“完全”。

我在正確的軌道上嗎? VS某處是否有配置選項,我可以告訴它使用dll文件,而忽略積極優化的本機映像?

感謝@HansPassant的幫助,我終於弄清楚了。

本機映像文件存儲在C:\\ Windows \\ assembly \\中,但是有一個名為shfusion.exe的Windows擴展名可以阻止對該文件夾的常規訪問。 通過在提升的cmd窗口中運行以下命令來解決此問題...

regsvr32 /u C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\shfusion.dll

然后您可以看到漢斯描述的內容... 在此處輸入圖片說明

接下來,我通過使用Process Hacker / Properties上下文菜單來檢查由devenv進程使用的.NET程序集,來確切確認Visual Studio正在使用哪個版本的本機映像。 它具有“路徑”和“本機圖像路徑”列,因此我可以確切地看到VS使用了哪些NI。 在此處輸入圖片說明 然后我重命名了我不想優化的模塊的文件夾...

在此處輸入圖片說明

確保我在VS選項/調試中具有正確的設置,包括抑制JIT優化... ![在此處輸入圖片描述

請注意,如果您按照禁用特定MSIL模塊的JIT優化中的問題添加ini文件,則不必選中“抑制JIT優化”復選框。

並解決了對象被優化而行跳過的調試問題。
就像這個答案中解釋的那樣,我可以將這樣的表達式放在斷點Action中,並且每次都可以使用...

{((EventSetterNull_SO_41604891_2670182.MainWindow)System.Windows.Application.Current.MainWindow).Logger.LogMemberTry(data, new [] \{"Name", "_value"\}, "XamlNodeList.Add ")}

如果要“調試”框架,則不需要JIT。

根據這個博客,

Microsoft Symbol Server中存在的所有PDB都沒有任何源信息,這使它們對於單步執行源不是很有用。

從.NET 4.5.1開始,符號索引和發布過程已更改為在發布更新時與構建過程同步,相應的PDB也已適當更新到參考源站點。

因此,您應該禁用Microsoft Symbol Server並進行更改以使用新的參考源站點: http : //referencesource.microsoft.com/

請按照以下步驟操作:

1)。 通過工具禁用Microsoft Symbol Server查找 選項| 調試| 符號。 確保未選中Microsoft Symbol Server前面的復選框。

2)。 將符號文件位置更改為http://referencesource.microsoft.com/

3)。 配置.NET參考源進行調試: http : //referencesource.microsoft.com/setup.html

有關更多詳細信息,請查看我上面提供的博客: http : //blogs.msdn.com/b/dotnet/archive/2014/02/24/a-new-look-for-net-reference- source.aspx

謝謝。

來源: https : //social.msdn.microsoft.com/Forums/vstudio/en-US/7bc17ae3-6480-439c-bec4-66be22dcfe02/obtaining-debug-symbol-pdb-files-for-net-framework-452?論壇= clr

暫無
暫無

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

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