2010-09-07 137 views
0

我試圖調試從Visual Studio 2010中我試圖按照這些指令的C/C++本地DLL項目: http://msdn.microsoft.com/en-us/library/c91k1xcf(v=VS.100).aspx調試Visual Studio 2010的DLL項目

我想使用內置的調試器,並能像步驟執行常規.exe項目一樣執行代碼,檢查結構等。上面的頁面上的說明描述了一個調試類別配置屬性,我沒有看到。

http://img707.imageshack.us/img707/4402/lalasz.png

只需按F5鍵下面的錯誤調試結果:

Unable to start program 'C:\Users.......Test.dll'

我用調試器進行定期的.exe項目很多次,它工作正常,這臺計算機上。但我不確定是否現在只是錯過了一些非常明顯的東西。

編輯:由於我從一開始就沒有說清楚,我希望Visual Studio能夠將我的DLL加載到一個存根過程中,並讓我在源代碼級別進行調試,就像OllyDbg的做法一樣。

我的DLL不是包含一堆要導出和調用的函數的類型。相反,它在DllMain中執行一個開關/情況,並在DLL_PROCESS_ATTACH上產生一個新線程。因此,我需要Visual Studio做的是將我的DLL加載到存根可執行文件中,並允許我設置斷點等。

回答

1

您右鍵單擊解決方案資源管理器窗口中的解決方案名稱並獲得解決方案屬性。請注意,該窗口顯示「解決方案測試屬性頁面」。

右鍵單擊項目名稱(粗體測試),而不是設置項目選項。

+0

感謝漢斯。調試選項卡在那裏,當我右鍵單擊正確的地方,但我意識到我誤解了頁面。我其實不想指定一個可執行文件。理想情況下,VC++會將我的DLL加載到存根可執行文件上,並讓我以這種方式進行分步操作。就像OllyDbg讓你這樣做。你知道這是可能的嗎? – Mike 2010-09-07 19:42:20

+2

不,VS需要一個.exe,任何.exe,加載DLL並調用您要測試的入口點。除了ActiveX測試容器之外,沒有通用的.exe可以找出你導出的函數需要什麼參數。單元測試總是一個不錯的選擇。 – 2010-09-07 19:59:37

+0

我的DLL不是包含要導出和調用函數的類型。入口點將在dwReason上切換/ case,並且在DLL_PROCESS_ATTACH上會用CreateThread()產生一個線程,這將會做一些工作。同一個DLL能夠在OllyDbg中使用「generic .exe」進行調試,該DLL只需使用一個在DLL上調用LoadLibrary的stub exe文件。我可以輕鬆創建自己的框架可執行文件,它可以完成同樣的功能,但是我無法通過IDE對其進行調試。 – Mike 2010-09-07 20:03:38

3

您可能已將啓動項目作爲生成dll的啓動項目。

有兩種選擇:將啓動項目更改爲另一個生成使用該DLL的可執行文件的項目,或者從項目屬性配置dll項目的調試設置以啓動使用該dll的外部應用程序(項目屬性/調試/命令)。

3

本地DLL無法獨立運行 - 它們必須在某些程序的上下文中運行。請參閱您引用的說明頁面的這一部分。

「如果您從創建DLL的項目開始調試,則必須指定要在調試DLL時使用的可執行文件。」

0

您也會從Managed項目中遇到此問題。 Visual Studio告訴你的是它不能運行DLL,就像你無法從資源管理器中雙擊一個DLL並運行一個程序一樣。

爲了調試DLL,編寫一個小的控制檯應用程序,從DLL調用函數並執行代碼。如果您的DLL具有功能foo(),請在控制檯應用程序中從main調用foo()。通過右鍵單擊解決方案資源管理器中的項目名稱並選擇其選項,將控制檯應用程序設置爲「啓動」項目。

然後,當你按下F5時,你將運行控制檯應用程序,它將調用DLL。

+0

我的DLL與常規DLL稍有不同。它會在DllMain中產生一個線程,並從那裏做其他工作。我知道這是不好的做法。我希望能夠像OllyDbg這樣的反彙編程序來調試它。不同之處在於我可以在源代碼級別執行此操作。 – Mike 2010-09-07 19:45:39