0

這是一種很長的解釋,但我並不完全確定問題出在我的調試過程中。試圖調試調用C++ DLL的VBA,「wntdll.pdb未加載」

我有一個Excel宏調用C++ DLL中的函數。每次調用此函數時,Excel實例都會突然強制退出而不顯示警告或錯誤消息。我試圖通過在Visual Studio Express中設置調試來追蹤發生了什麼,如下所示:

配置屬性 - >調試 - >命令:C:\ Program Files(x86)\ Microsoft Office \ Office14 \ EXCEL。 EXE

配置屬性 - > C/C++ - >瀏覽信息 - >啓用瀏覽信息:是(/ FR)

然後我點擊我要測試的功能開始調試,設置斷點,然後按F5。我收到一條錯誤消息,告訴我調試信息不​​適用於Excel.exe,然後單擊「是」繼續調試。

Excel實例打開。現在C++斷點已經變成了白色的「斷點不會被擊中」的圓圈。我用我的宏打開工作簿,並運行宏。

在Visual Studio中,我收到一條消息,指出EXCEL.EXE觸發了一個斷點,我想這是我在C++代碼中設置的斷點,然後單擊「斷點」。新標籤中打開,用一條消息:

wntdll.pdb not loaded 

此時,調試器將無法繼續,所以我手動停止,和Excel力退出;在輸出窗口說

EXCEL.EXE已與代碼退出0

我進入調試選項 - >符號,然後選中「Microsoft符號服務器」複選框;我不知道哪些DLL需要符號,所以我選擇「自動加載所有模塊的符號」。我開始調試器。

我收到有關調試信息不​​可用於Excel的相同消息,然後打開Excel實例。我再次打開工作簿並啓動宏。與此同時,在VS中有很多DLL的符號被加載。

一個選項卡VS彈出,上面寫着:

Source not available 
Source information is missing from the debug information in this module. 

也許正確的DLL的符號還沒有被加載,但我不想等待所有加載符號;我之前試過,10分鐘過去了,符號仍在加載。

望着調用堆棧,下面的調用是最近:

[email protected]() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 

無我的C++應用程序的代碼已經被稱爲之中;這些調用在VBE7和ole32調用後立即發生。

我只是想能夠調試我的代碼並找出Excel退出的原因。任何人都可以理解這裏發生的事情嗎?

編輯:這裏是完整的調用堆棧時出現錯誤:

[email protected]() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 
ole32.dll!CRetailMalloc_GetSize(IMalloc * pThis, void * pv) Line 710 C++ 
oleaut32.dll!APP_DATA::FreeCachedMem(void *,unsigned long) Unknown 
[email protected]() Unknown 
VBE7.DLL!_lblEX_FFreeStr() Unknown 
VBE7.DLL!_lblEX_VCallHresult() Unknown 
VBE7.DLL!_lblEX_ImpAdCall() Unknown 
VBE7.DLL!InvokeImmedSub(struct RTMI *,class GEN_PROJECT *,class EXFRAME *,struct IDispatch *) Unknown 
VBE7.DLL!WATCHMGR::ExecuteImmedLogln(char * *,unsigned int,int,class GEN_PROJECT *,unsigned long,int,int,class WATCH *) Unknown 
VBE7.DLL!ExecProcUnderCursor(void) Unknown 
[email protected]() Unknown 
VBE7.DLL!CmdFDispatchCommand(unsigned short) Unknown 
VBE7.DLL!FTranslateAccelerator(struct tagMSG *,int) Unknown 
VBE7.DLL!FRubyMsg(struct tagMSG *) Unknown 
VBE7.DLL!MainFTranslateMessage(struct tagMSG *,unsigned long) Unknown 
VBE7.DLL!CMsoComponent::FPreTranslateMessage(struct tagMSG *) Unknown 
EXCEL.EXE!2f9f874a() Unknown 
[Frames below may be incorrect and/or missing, no symbols loaded for EXCEL.EXE] 
EXCEL.EXE!2f9f73f4() Unknown 
MSO.DLL!637b77f1() Unknown 
MSO.DLL!637e0143() Unknown 
EXCEL.EXE!2f990ec5() Unknown 
msvcr90.dll!___set_flsgetvalue() Unknown 
msvcr90.dll!__getptd_noexit() Unknown 
msvcr90.dll!__getptd() Unknown 
msvcr90.dll!_LocaleUpdate::_LocaleUpdate(struct localeinfo_struct *) Unknown 
msvcr90.dll!__ismbcalpha() Unknown 
msvcr90.dll!__ismbblead() Unknown 
0062430d() Unknown 
[email protected]@12() Unknown 
[email protected]() Unknown 
[email protected]() Unknown 
+0

當錯誤發生時,你可以給完整的調用堆棧嗎? –

+0

@IlyaBursov,只是發佈它。 – sigil

+0

'0062430d()未知'看起來很可疑,但無法確定,嘗試另一種方法:在沒有調試的情況下運行excel,然後使用studio'attach to process',然後嘗試執行excel宏 –

回答

2

程序數據庫(PDB)文件保存調試和項目狀態信息,使你的程序的調試配置的增量鏈接。 Visual Studio只是告訴你,他找不到相關的調試信息以允許您使用源代碼進行調試。

我認爲wntdll.pdbntdll.dll有關,你可以在工具 - >選項 - >調試 - >符號中設置VS中的符號目錄。

這個頁面有一些信息,特別是有關使用symchk.exe下載符號的一部分:

Windows Debugging Symbols - Not Loading

有關如何使用symchk.exe說明是:

http://support.microsoft.com/kb/311503

現在這個問題可能與您的崩潰無關,我建議您使用Process Monitor來監控進程中的消息。這可能會極大地幫助您確定問題出在哪裏。

+0

我下載了Process Monitor,並且運行了相同的調試方法我上面描述過。我不知道如何解釋這些消息。最後,有很多WDEXPRESS.EXE和EXCEL.EXE消息說「關閉文件」。我應該尋找什麼? – sigil

+0

很難說,因爲您目前沒有足夠的信息來縮小範圍。你有沒有試圖停止在視覺工作室的例外?你有你調用的DLL的代碼嗎?嘗試在ProcMon中對DLL進行過濾。 – BlueTrin