这是一个很长的解释,但我不确定问题出在我的调试过程中。
我有一个调用 C++ DLL 中的函数的 Excel 宏。每次调用此函数时,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++ 代码中设置的断点,然后单击“Break”。将打开一个新选项卡,并显示一条消息:
wntdll.pdb not loaded
此时,调试器将无法继续,所以我手动停止它,Excel 强制退出;输出窗口说
EXCEL.EXE 已退出,代码为 0
我进入 Debug options->Symbols 并选中“Microsoft Symbol Server”框;我不知道哪些 DLL 需要符号,所以我选择“自动为所有模块加载符号”。我启动调试器。
我收到有关 Excel 不可用的调试信息的相同消息,然后 Excel 实例打开。我再次打开工作簿并启动宏。与此同时,在 VS 中加载了很多 DLL 的符号。
VS中弹出一个选项卡,上面写着:
Source not available
Source information is missing from the debug information in this module.
也许还没有加载正确的 DLL 符号,但我不想等待所有符号加载;我之前尝试过,10 分钟过去了,符号仍在加载。
查看调用堆栈,以下调用是最新的:
ntdll.dll!_RtlReportCriticalFailure@8() Unknown
ntdll.dll!_RtlpReportHeapFailure@4() Unknown
ntdll.dll!_RtlpLogHeapFailure@24() Unknown
还没有调用我的 C++ 应用程序的代码;这些调用紧跟在 VBE7 和 ole32 调用之后。
我只想能够调试我的代码并找出 Excel 退出的原因。任何人都可以理解这里发生的事情吗?
编辑:这是发生错误时的完整调用堆栈:
ntdll.dll!_RtlReportCriticalFailure@8() Unknown
ntdll.dll!_RtlpReportHeapFailure@4() Unknown
ntdll.dll!_RtlpLogHeapFailure@24() Unknown
ntdll.dll!_RtlSizeHeap@12() Unknown
ole32.dll!CRetailMalloc_GetSize(IMalloc * pThis, void * pv) Line 710 C++
oleaut32.dll!APP_DATA::FreeCachedMem(void *,unsigned long) Unknown
oleaut32.dll!_SysFreeString@4() 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
VBE7.DLL!_EbInvokeItem@4() 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
kernel32.dll!@BaseThreadInitThunk@12() Unknown
ntdll.dll!___RtlUserThreadStart@8() Unknown
ntdll.dll!__RtlUserThreadStart@8() Unknown