2011-04-27 52 views
2

如何調試Visual C++ 2010 SP1應用程序無法完全加載其依賴項並且過早退出而不顯示其UI的情形?如何調試靜態依賴加載問題?

如果您認爲它們是相關的,我對Fusion Logs,dependency walker和遠程調試器有很好的指導。是否可以使用WinDbg輕鬆驗證?怎麼樣Process Explorer?

是否可以在遠程調試器附加的遠程機器上啓動進程?

是否可以驗證是否安裝了正確的Visual C++ 2010 SP1運行時?

一個限制:應用程序在安裝了Visual Studio的開發者框中運行良好。問題只能在乾淨的目標機器上觀察到。這意味着安裝工具鏈時問題可能會消失。

+1

http://stackoverflow.com/questions/255669/how-to-enable-assembly-bind-failure-logging-fusion-in-net – GregC 2011-04-27 05:14:42

+0

http://msdn.microsoft.com/en-us/library /2ys11ead.aspx – GregC 2011-04-27 05:19:46

回答

1

是否可以在遠程計算機上啓動遠程調試器的進程?

當然可以。例如,在Visual Studio 2008中,右鍵單擊您的項目 - >屬性 - >配置屬性 - >調試,在「調試器啓動」下拉列表中選擇「遠程Windows調試器」。然後在遠程機器上輸入EXE的完整路徑並根據參數(如果有的話)。

在此之前,您需要先在遠程計算機上運行遠程調試監視器。將\ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ Remote Debugger \ x86(或其他平臺)複製到遠程計算機,然後運行msvsmon.exe。

通常,如果您的應用程序由於缺少某些靜態依賴項而退出,那麼可以使用依賴關係助手來檢查缺少哪一個。

2

查看/ VERBOSE開關是否可以幫助您瞭解鏈接程序在生成並開始調試代碼時試圖加載和運行哪個依賴項。

如果您使用/ VERBOSE開關,基本上鍊接器會將消息寫入輸出窗口,以獲得鏈接器加載的庫的信息,這在構建日誌中也是可用的,因此您可以查看它以供參考。這樣,如果加載特定的依賴關係時出錯,可能會對您有所幫助。

我試過/ VERBOSE當我有鏈接錯誤,並知道哪些依賴項導致我的代碼中的問題。

請參閱http://msdn.microsoft.com/en-us/library/wdsk6as6(v=vs.80).aspx以檢查這是否可以幫助您。

4

我總是DependencyWalker,然後用the Global Flags Editor gFlags.exe檢查DLL的依賴問題,請在「圖像文件」選項卡,設置程序,並檢查「顯示裝載機卡」。

當你的程序運行時,WinDbg.exe應該在dependencyWalker和你的源代碼的幫助下(如果你使用的是LoadLibrary)輸出很多DLL加載消息,從它們中,你應該能夠找出哪裏出錯。

+1

對「顯示加載器快照」的另一投票。你會學到比你想知道的DLL負載分辨率更多的東西。 SxsTrace也將顯示沒有調試器的並行DLL加載的詳細信息,並且會很快顯示C運行時是否丟失。 – 2011-05-07 03:29:56

+0

對Dependency Walker的引用應該伴隨着一個大的警告標誌,它不再可靠。它幾年來一直沒有更新,並且幾乎顯示任何版本的Windows 7及更高版本的誤導性信息。 – IInspectable 2017-06-28 14:45:08