MFC 应用程序在 NTDLL.dll 中崩溃

Posted

技术标签:

【中文标题】MFC 应用程序在 NTDLL.dll 中崩溃【英文标题】:MFC application Crashes in NTDLL.dll 【发布时间】:2015-09-02 18:04:56 【问题描述】:

我有一个基于 MFC 的应用程序。它会在几秒钟后继续寻找文件(使用基于 CreateTimerQueueTimer 的计时器)并执行一些操作。这总是在 XP 上崩溃(原因不明)。此应用程序在 Windows 7 和 Windows 8 上运行良好。但 XP 上的问题仍然存在。

下面是没有显示任何帮助的调用堆栈

反汇编截图如下:

EDIT1:

我更改了一些设置并获得了这个新的调用堆栈。但仍然没有得到线索。:

我不明白如何找出崩溃的原因。是否有任何提示或任何方法可以跟踪从拆卸中播下的内容?还是系统的 NTDLL.DLL 文件有问题?欢迎任何帮助。

【问题讨论】:

该堆栈跟踪缺少重要部分。您需要说服 Visual Studio 为您的可执行文件加载调试符号。 这就是问题所在。我的意思是仅针对此问题,它提供如上所示的调用堆栈。这就是为什么我无法抓住罪魁祸首。你知道我怎样才能让 Visual Studio 调试器给我那个吗? 应用程序是否使用调试符号构建?如果是这样,您应该能够在项目属性中指定符号的位置。 嗯,我可以看到我的调试信息格式设置为 /ZI 。我还需要做什么吗? 您是否在 XP 机器上运行 Visual Studio?还是你在远程调试呢?或者您正在调试转储文件?加载符号可能取决于这些问题的答案。同时,尝试将 .PDB 文件放在 .EXE 文件旁边。 【参考方案1】:

分析堆栈后,我意识到定时器回调可能有问题。我将我的计时器(createtimerqueuetimer 函数)更改为等待线程,问题就解决了。但是对于为什么定时器回调在几次调用后崩溃仍有待回答?我只是在 30 秒后设置和重置回调函数中的变量。所以我不怀疑任何与指针相关的问题。

EDIT1:

我终于得到了答案。我需要改变

void MyTimerCallbackRoutine(PVOID lpParameter, BOOLEAN TimerOrWaitFired)

收件人:

VOID CALLBACK MyTimerCallbackRoutine(PVOID lpParameter, BOOLEAN TimerOrWaitFired)

问题与定时器回调函数有关。通常,CALLBACK 和 WINAPI 被定义为 stdcall,而普通函数默认使用 cdecl。

【讨论】:

以上是关于MFC 应用程序在 NTDLL.dll 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

.NET Windows 服务在 ntdll.dll 中崩溃

为啥 ntdll.dll 会使我的 c++ 可执行文件崩溃?

java与ntdll.dll的关系

Qt Creator 在尝试运行 OpenCV 程序时崩溃。 [ntdll.dll 崩溃]

有没有办法让Windows 7 x64从本地目录加载ntdll.dll,而不是system32?

安装 IE9 后 Visual Studio 2012 崩溃(故障模块 ntdll.dll)