2010-01-28 61 views
3

我有一個非常奇怪的與自編碼DLL調試有關的問題。我有一個MFC驅動的基於對話框的應用程序,幾個靜態鏈接的項目和幾個在運行時加載的DLL項目。調試器忽略動態加載的DLL中的錯誤

我構建調試解決方案,運行應用程序,我可以很容易地調試這些DLL項目。現在的問題。如果在DLL中一些明顯的運行時錯誤像下面

int* i = 0; 
*i = 4; 

調試斷言沒有錯誤,拋出也不例外,默默地返回甚至沒有(看到)堆棧返回到怠速狀態。看起來好像當我在語句*i = 4;上點擊F10時,控制權返回到主應用程序窗口,程序繼續執行,因爲什麼都沒有發生!如果代碼中沒有錯誤,則執行正常。但我希望在這種情況下可以斷言錯誤!它們是 - 在主應用程序的代碼中。

我使用LoadLibrary()函數將我的DLL加載到應用程序中。 DLL本身具有靜態鏈接的MFC,與解決方案中的其他項目一樣。

任何想法?甚至不知道谷歌有什麼問題...

回答

0

哦,事實證明,這個問題是由OpenGL wglMakeCurrent()調用引起的,只有在使用NVIDIA GeForce 8800圖形卡的Windows 7 64位版本下才會出現,同時在Windows Vista 32位版本下,所有這些都可以正常工作。

我問了一個新問題here。感謝您的反饋意見。

1

很有可能你是從一個不正確的位置加載LoadLibrary()的DLL,並且缺少PDB會阻止調試器設置中斷點。您也可以加載斷言Asserts的零售DLL(如果'錯誤被斷言',你的意思是你有代碼中的ASSERT)。如果錯誤是頁面錯誤(如您在示例中顯示的AV)並且調試程序沒有中斷,則意味着該異常已處理。你可以隨時開啓休息,例如。 sxe av。不知道你是如何從代碼編輯工具中做到這一點的,但你總是可以使用real debugger

1

您的代碼庫中存在異常處理程序,它正在吞噬異常。首先查找SetUnhandledExceptionFilter。另外:Debug + Exceptions,Win32 Exceptions,勾選Thrown複選框。

0

哦,好像這個bug根本就和DLL沒有關係。調試器在主應用程序模塊中的行爲也是相同的。我已經將這段代碼片段插入到OnInitDialog()函數中,並按鈕單擊OnBnClickedButton1()處理函數。

在第一種情況下(當在OnInitDialog()內部時),像往常一樣引發異常,程序無法從此錯誤中恢復。下面的消息被跟蹤輸出窗口:在dmc.exe在0x00a3a83e

第一次機會異常:0000005:訪問 衝突寫入位置00000000。

dmc.exe中0x00a3a83e 的第一次機會異常:0xC0000005:訪問 違規寫入位置0x00000000。

0x00a3a83e處未處理的異常 dmc.exe:0xC0000005:訪問衝突 寫入位置0x00000000。

但是在第二種情況下(當內部OnBnClickedButton1())不會拋出異常,OnBnClickedButton1的執行()被中止,程序繼續正常運行。下面的消息被跟蹤輸出窗口:在dmc.exe在0x00a3c23f

第一次機會異常:0000005:訪問 衝突寫入位置00000000。

所以看起來應用程序初始化後出現了一些頂級異常處理程序。我已經創建了新的測試應用程序,並嘗試使用它,在這兩種情況下都會引發異常。我已經比較了他們的項目設置(比較.vcproj文件),並發現沒有與此問題相關的差異。

也許這種行爲是由一些奇怪的MFC宏定義控制的?還是我無意中受到其他一些設置的影響?

對不起,在第一個版本的問題。