2009-06-02 68 views
3

我有一個應用程序,我沒有代碼,以及我有代碼的dll。我需要能夠調試到DLL,但缺乏EXE的來源,我該怎麼做?如何在執行期間停止C++應用程序以調試到dll?

該dll代碼是mfc C++;我相信主應用程序也是一樣的。

我試着做一個'設置目標應用程序'的協議,在那裏我設置的應用程序,該DLL將被調用,並且應用程序崩潰一個可怕的,可怕的死亡,當這樣調用。我不知道錯誤在於這個dll還是這個行爲的可執行文件,這只是我想解決的無數事情之一。

我在想,應該有一些調用來允許DLL無限期旋轉,直到調試器連接到進程,此時我應該能夠通過附加到進程來調試DLL。那有意義嗎?有一個更好的方法嗎?

+0

如果先啓動exe然後附加調試器,會發生什麼?您還無法設置斷點? – Naveen 2009-06-02 18:13:00

+0

我懷疑你需要以你描述的標準方式調試exe/dll時才能到達崩潰的底部。雖然你可以在應用程序啓動後「附加」一個調試器,但是我不知道系統是否會隨即崩潰。 – Aardvark 2009-06-02 18:22:59

+0

@Naveen:如果我附加到正在運行的進程,則忽略斷點。 @Aardvark:在我將要嘗試的那個調試中斷事件後我會發現。我強烈懷疑,由於應用程序和dll通過希望和膠帶粘在一起,我不打算修復崩潰。我只想提取一部分dll,以便能夠以一種理智的方式進行重寫。 – mmr 2009-06-02 18:35:15

回答

2

如果應用程序與非調試DLL鏈接,並且本身沒有調試符號,這可能並不是很有成效。你可能想看看here以獲得關於使用windows符號包來幫助你的信息,如果你對windows DLL裏面發生了什麼感到好奇,但總的來說,沒有調試信息並且你不能編譯的應用程序isn可以用任何有意義的方式調試。

2

有一個名爲ImageFileExecutionOptions的註冊表設置,可以設置爲在加載DLL時啓動調試器。我曾經使用它來調試ISAPI擴展。這裏是一個鏈接to a decent blog entry about it

+0

所以,我試圖做到這一點,並沒有完全奏效。我將調試器設置爲可執行文件,然後在我的dll項目中啓動可執行文件。然後我設置了一個斷點,但同樣沒有達到斷點。如果將dll設置爲該鍵的目標,那麼調試器就不會啓動。我可以給你更多的細節,因爲這看起來像一個有前途的解決方案,但它現在不工作。 – mmr 2009-06-02 18:28:26

+0

我認爲你必須設置一個斷點然後恢復執行。基本上,調試器是使用NTLDR掛鉤啓動的,因此它在任何*代碼執行之前啓動。對於ISAPI擴展,我會在我的HttpExtensionProc中添加一個斷點並讓它運行。然後,只要通過擴展調用IIS,它就會停止。我似乎無法找到解釋如何通過Google執行此操作的網頁。查看調試ISAPI擴展的提示。祝你好運! – 2009-06-02 19:43:03

1

對於DLL項目,您應該能夠告訴Visual Studio開始調試,並且它會詢問您一個可執行文件的名稱。在那裏輸入你的exe。當我研究從另一個進程調用的DLL代碼時,我做了很多工作。適用於直連DLL以及COM組件。

如果您知道問題出在哪裏,也可能有助於在代碼中提前設置一些斷點。

更新:由於這不適合你,我唯一能想到的其他事情就是附加到正在運行的exe文件,但是如果你的代碼在你有機會獲得之前被加載,那麼這可能是有問題的在那裏。

4

我以前使用DebugBreak這個功能。也許你可以根據特定文件的存在有條件地調用它。

#ifdef DEBUG 
if (... file exists...) { 
    DebugBreak(); 
} 
#endif 

這將暫停應用程序執行,直到您附加調試器或終止應用程序。

0

這裏有一個簡單的解決方案:添加DllMain中Sleep(10000);(或一些其他的啓動代碼),然後使用Tools/Attach to Process附加調試器在代碼正在睡覺。

1
__asm int {3}; 

在您的DLL主。然後將調試器附加到該過程? 如果這會殺死進程,那麼它可能有它自己的int3陷阱並正在退出。你是否試圖調試受版權保護的遊戲或類似的東西?因爲他們傾向於做這種棘手的行爲。

0

我想應該有一些 調用允許DLL旋轉 無限期,直到調試器附加到進程 ,在這 點我應該能夠通過安裝調試 DLL到這個過程。 有道理嗎?有沒有更好的方法 要做到這一點?

爲什麼不按照你描述的方式去做呢?只需啓動您想要調試的應用程序。通過Visual Studio或通過右鍵單擊任務管理器中的應用程序並選擇「調試」,將調試器附加到它。一旦連接了調試器,在你的dll代碼的適當位置用F9設置一個斷點。

1

等待直到調試器是本:

while(!IsDebuggerPresent()) 
{ 
    Sleep(0); // yield 
} 

MSDN文檔:IsDebuggerPresent()

1

確保應用程序確實使用您在調試模式下使用符號構建的DLL。您可以使用諸如Process Explorer之類的程序(在此應用程序中啓用「查看」菜單中的下窗格並選擇DLL)來驗證此情況。

然後,在Visual Studio的「調試」菜單中,選擇「附加到進程」,然後選擇使用您的DLL的應用程序。當你的DLL被加載時,你的調試斷點應該被填充。

0

我試圖做一個「設定的目標 應用」交易,在這裏我設置 應用程序,該DLL將 從調用,應用 崩潰可怕的,可怕的死亡 叫做這樣當。我不知道是否 錯誤在於此dll或 該行爲的可執行文件,以及 這只是 想要解決的無數事情之一。

在調試器內啓動進程會導致Windows啓用NT debug heap。這聽起來像應用程序或DLL有堆損壞或依賴於未初始化的堆內存的值。

通過將環境變量_NO_DEBUG_HEAP設置爲1(在XP及更高版本上),可以禁用NT調試堆。這可能使應用程序在從調試器啓動時不會死於可怕的死亡。

在調試器外部啓動應用程序也會導致禁用NT調試堆,稍後連接調試器將不會啓用它。

相關問題