底部 4GB 已满时 FileDialog 崩溃

Posted

技术标签:

【中文标题】底部 4GB 已满时 FileDialog 崩溃【英文标题】:FileDialog crash when bottom 4GB full 【发布时间】:2012-03-13 22:37:15 【问题描述】:

为了在 64 位中捕获指针截断错误,我添加了提到的代码 sn-p here,它保留了底部 4GB 内存,因此分配器高于 32 位。在 MFC x64 测试应用程序中,我首先在 InitInstance() 中调用预留函数。然后我添加了一个简单的按钮:

CFileDialog dlg(TRUE);
dlg.DoModal();

调用 DoModal 最终会在“无人区”中的某个调用堆栈崩溃:

>   000000018000163b()  
    0000000100000024()  
    0000000000000001()  

这不是 MFC 特定的,因为我使用 .NET FileDialog 得到了相同的行为。我认为这是我无法控制的事情,因为实际的 fileDialog 短暂显示然后崩溃。感觉像是一个 shell 扩展或其他东西,但我无法知道它的来源,因为调用堆栈没有帮助 - 但我想知道是否有什么我能做的!

如果我删除特殊预订功能,我就不会再遇到崩溃了。

困惑!

【问题讨论】:

嗯,它正在工作,你正在捕捉指针错误。只是不在您的代码中。使用 SysInternals 的 AutoRuns 实用程序禁用 shell 扩展。 如果你用 GetOpenFileName (msdn.microsoft.com/en-us/library/windows/desktop/…) 尝试同样的事情会发生什么? +Ton 网站下载... 你能检查一下它出现在哪个模块的地址空间,或者堆栈被破坏了吗? 是的,我知道它有效(崩溃)!感谢 AutoRun 实用程序,我不知道它存在。但是,禁用所有 shell 扩展仍然会崩溃。至于模块,调用栈彻底砸了;我所拥有的就是我原来的帖子中的内容 我很好奇其他人是否有同样的行为,虽然我知道每个人的时间都很宝贵 【参考方案1】:

我无法重现这次崩溃。我创建了一个 64 位项目,添加了 4 GB 预留空间,并在其中打开了一个文件对话框。没有崩溃。

要么我的重现与你的不匹配,要么你的系统上有一些不同的东西。您应该发布您的项目,以便我们可以删除其中一个变量。

很遗憾,我不记得 TppWorkerThread 是什么。

发布您的项目 - 所有源文件、资源文件、.vcxproj 文件和 .sln 文件。然后我们就可以调查了。

【讨论】:

Bruce 给了我一个想法:您确定您的进程中没有加载其他 DLL 吗?我知道有许多扩展程序会在对话框中自行加载,它们可能会将其关闭。【参考方案2】:

为了跟进这个问题,我们发现360 sdk安装的一个shell扩展导致了这个问题(xeshlext.dll)

【讨论】:

我自己的后续。我们发现一个内部服务与 360 shell 扩展冲突并导致崩溃。升级到最新版本修复了一切。打扰您了!

以上是关于底部 4GB 已满时 FileDialog 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使磁盘已满PHP仍返回0

JPA检查是不是为空查询

Microsoft SQL Server - 事务日志已满是啥意思?

如何写入使用 filedialog.asksaveasfile 选择的文件?

写系统调用直接将数据写入磁盘?

golang fifo 缓冲通道