试图调试调用C ++ DLL的VBA,“wntdll.pdb未加载”

时间:2013-11-01 18:18:10

标签: c++ visual-c++ visual-studio-2012 dll visual-studio-debugging

这是一个很长的解释,但我不确定调试过程中的问题在哪里。

我有一个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 ++代码中设置的断点,然后点击“Break”。将打开一个新选项卡,其中包含以下消息:

wntdll.pdb not loaded

此时,调试器将不会继续,因此我手动停止它,并且Excel强制退出;输出窗口说

EXCEL.EXE已退出,代码为0

我进入调试选项 - >符号并检查“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

1 个答案:

答案 0 :(得分:2)

程序数据库(PDB)文件包含调试和项目状态信息,允许增量链接程序的Debug配置。 Visual Studio只是告诉您他找不到相关的调试信息,以允许您使用源代码进行调试。

我认为wntdll.pdbntdll.dll有关,您可以通过进入工具设置VS中的符号目录 - >选项 - >调试 - >符号。

此页面包含一些信息,尤其是关于使用symchk.exe下载符号的部分:

Windows Debugging Symbols - Not Loading

有关如何使用symchk.exe的说明在:

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

现在这个问题可能与您的崩溃无关,我建议您使用Process Monitor来监控来自该进程的消息。这可能会极大地帮助您确定出错的地方。