首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LoadLibrary()失败,错误8 (ERROR_NOT_ENOUGH_MEMORY)

LoadLibrary()失败,错误8 (ERROR_NOT_ENOUGH_MEMORY)
EN

Stack Overflow用户
提问于 2014-09-25 20:43:40
回答 1查看 3.7K关注 0票数 0

稍后编辑:经过更多调查后,OpenGL更新和OpenGL DLL都是红鲱鱼。造成这些症状的原因是LoadLibrary()呼叫GetLastError() == ERROR_NOT_ENOUGH_MEMORY失败。如何解决这些问题,请看我的答案。以下是历史兴趣的原始问题。/edit

我用Python/wxPython编写的带有C++后端的地图查看器突然停止工作,没有任何代码更改,甚至没有重新编译。几周前,相同的可执行文件(相同的Python、相同的DLL、.)一直在工作。

现在,当查询OpenGL (与ChoosePixelFormat())一起使用的像素格式时,我得到了一个MessageBox:

代码语言:javascript
复制
LoadLibrary failed with error 8:
Not enough storage is available to process this command

执行以下代码片段时会显示错误消息:

代码语言:javascript
复制
void DevContext::SetPixelFormat() {
    PIXELFORMATDESCRIPTOR pfd;
    memset(&pfd, 0, sizeof(pfd));
    pfd.nSize        = sizeof(pfd);
    pfd.nVersion     = 1;
    pfd.dwFlags      = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
    pfd.iPixelType   = PFD_TYPE_RGBA;
    pfd.cColorBits   = 32;

    int pf = ChoosePixelFormat(m_hdc, &pfd);    // <-- ERROR OCCURS IN HERE
    if (pf == 0) {
        throw std::runtime_error("No suitable pixel format.");
    }

    if (::SetPixelFormat(m_hdc, pf, &pfd) == FALSE) {
        throw std::runtime_error("Cannot set pixel format.");
    }
}

它实际上是一个显示消息框的ATI驱动程序DLL。调用堆栈的相关部分如下:

代码语言:javascript
复制
                  ... More MessageBox stuff
0027e860 770cfcf1 USER32!MessageBoxTimeoutA+0x76
0027e880 770cfd36 USER32!MessageBoxExA+0x1b
*** ERROR: Symbol file not found. Defaulted to export symbols for C:\Windows\SysWOW64\atiglpxx.dll -
0027e89c 58471df1 USER32!MessageBoxA+0x18
0027e9d4 58472065 atiglpxx+0x1df1
0027e9dc 57acaf0b atiglpxx!DrvValidateVersion+0x13
0027ea00 57acb0f3 OPENGL32!wglSwapMultipleBuffers+0xc5e
0027edf0 57acb1a9 OPENGL32!wglSwapMultipleBuffers+0xe46
0027edf8 57acc6a4 OPENGL32!wglSwapMultipleBuffers+0xefc
0027ee0c 57ad5658 OPENGL32!wglGetProcAddress+0x45f
0027ee28 57ad5dd4 OPENGL32!wglGetPixelFormat+0x70
0027eec8 57ad6559 OPENGL32!wglDescribePixelFormat+0xa2
0027ef48 751c5ac7 OPENGL32!wglChoosePixelFormat+0x3e
0027ef60 57c78491 GDI32!ChoosePixelFormat+0x28
0027f0b0 57c7867a OutdoorMapper!DevContext::SetPixelFormat+0x71 [winwrap.cpp @ 42]
0027f1a0 57ce3120 OutdoorMapper!OGLContext::OGLContext+0x6a [winwrap.cpp @ 61]
0027f224 1e0acdf2 maplib_sip!func_CreateOGLDisplay+0xc0 [maps.sip @ 96]
0027f240 1e0fac79 python33!PyCFunction_Call+0x52
                  ... More Python stuff

两周前,我做了一个Windows ,注意到了一些小故障(例如,调整窗口大小时),但我的程序仍然工作正常。刚才我重新启动了,Windows又安装了一个更新程序,我再也不能通过ChoosePixelFormat()了。然而,上一次安装的更新是KB2998527,俄罗斯时区更新?!

我已经查过的东西:

  • 重新编译并不能使它工作。
  • 在没有其他程序运行的情况下重新启动和运行是行不通的。
  • 我的程序的内存消耗只有67 MB,我没有用完内存。
  • 足够的磁盘空间免费(~50 GB)。
  • HDC m_hdc是从显示面板的HWND获得的,并且似乎是有效的。
  • 更改链接器命令行不工作。

我应该更新图形驱动程序还是回滚更新?还有其他想法吗?

系统数据转储: Windows 7终极SP1 x64,4 4GB内存;HP EliteBook 8470 p;Python3.3,wxPython 3.0.1.dev76673 msw (菲尼克斯);通过SIP4.15.4访问C++数据结构;用Visual 2010 Express编译C++代码,用/MDd调试构建。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-25 23:37:11

I正在耗尽虚拟地址空间.

默认情况下,LibTIFF通过内存映射(mmap()CreateFileMapping())读取TIF图像。这对于你妻子的照片是很好的,但事实证明,这对价值千兆字节的阿尔卑斯山地形图来说是个坏主意。

这是很难诊断的,因为如果内存映射失败,LibTIFF就会悄悄地退回到read(),因此以前从来没有显式错误。此外,Windows不将映射内存视为工作内存,因此任务管理器显示了67 up,而实际上几乎所有的虚拟地址空间都用完了。

由于最近我将更多的TIF图像添加到数据库中,所以现在这一切都搞砸了。LoadLibrary()开始失败是因为它找不到任何地址空间来放置新的库。GetLastError()返回8,即ERROR_NOT_ENOUGH_MEMORY。这种情况发生在ATI的OpenGL库中只是巧合。

解决方案是将"m"作为标志传递给TiffOpen(),以禁用内存映射的IO。

诊断此很容易使用Windows SysInternals工具VMMap (文档链接),它向您展示了进程的虚拟地址空间有多少被代码/堆/堆栈/映射文件/可共享数据/等等占用。

这应该是检查LoadLibrary()CreateFileMapping()是否在ERROR_NOT_ENOUGH_MEMORY中失败的第一件事。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26047771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档