c++ - 为什么我的程序在 nVidia NView 下占用 100% CPU?

标签 c++ windows nvidia

我最近在开发一个 Windows 程序,在生产环境中滚动浏览大量项目时有时会变得无响应。当然,它在我的桌面上运行良好。生产环境为:

  • 基于 Windows XP 的工作站,配备 2 个显示器
  • 启用 nView 的 nVidia 视频驱动程序

值得注意的是进程终止时生成的 Dr watson 堆栈跟踪:

State Dump for Thread Id 0xef4

eax=00e3fff8 ebx=000000a0 ecx=00e00000 edx=00000000 esi=0003fff8 edi=00e40000
eip=00b920c2 esp=0012bcac ebp=00000000 iopl=0         nv up ei ng nz na pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000283

\system32\nview.dll - 
function: nview!NVLoadDatabase
        00b920a8 c80b0600         enter   0x60b,0x0
        00b920ac 83c30f           add     ebx,0xf
        00b920af 33f6             xor     esi,esi
        00b920b1 03f9             add     edi,ecx
        00b920b3 83e3f8           and     ebx,0xfffffff8
        00b920b6 3bcf             cmp     ecx,edi
        00b920b8 89742414         mov     [esp+0x14],esi
        00b920bc 734c             jnb     nview!NVLoadDatabase+0xcaf (00b9210a)
        00b920be 8bc1             mov     eax,ecx
        00b920c0 8b10             mov     edx,[eax]
        00b920c2 8b4004           mov     eax,[eax+0x4]     ds:0023:00e3fffc=00000000
        00b920c5 89442414         mov     [esp+0x14],eax
        00b920c9 8bc2             mov     eax,edx
        00b920cb 2500000001       and     eax,0x1000000
        00b920d0 33ed             xor     ebp,ebp
        00b920d2 0bc5             or      eax,ebp
        00b920d4 7414             jz      nview!NVLoadDatabase+0xc8f (00b920ea)
        00b920d6 8bc2             mov     eax,edx
        00b920d8 c1e008           shl     eax,0x8
        00b920db 8be8             mov     ebp,eax
        00b920dd c1f81f           sar     eax,0x1f

ChildEBP RetAddr  Args to Child              
00000000 00000000 00000000 00000000 00000000 nview!NVLoadDatabase+0xc67

为什么这个问题只出现在生产环境中?

最佳答案

这很有趣,因为 nView 是 NVidia 提供的第 3 方 DLL。互联网上有关 nview!NVLoadDatabase 的帖子表明 nview 中存在未修补的缺陷。正如这些报告所证实的,资源管理器使用 100% CPU 的事实支持了这一点。请参阅:http://forums.nvidia.com/lofiversion/index.php?t36879.html

此站点上提供了对此问题的详细调查: http://blogs.technet.com/marcelofartura/archive/2007/02/28/real-case-random-apps-running-100-cpu.aspx

根据这篇文章,挂起是由于 nview.dll 中的无限循环。虽然网上描述的汇编指令和寄存器值与我们日志中的不完全匹配,但它们足够接近,我可以断定这是同一个问题。

为了解决这个问题,我禁用了 nView 桌面管理器(右键单击桌面,选择 nView 属性,然后单击 nView 桌面管理器组框中的禁用)。在这样做之前,我能够始终如一地重现挂起。但是,在禁用 nView 后,我无法重现挂起。因此,这似乎是一个可行的解决方法。

不管怎样,我把它贴在这里,以防它对任何人都有用。追逐这个让我很伤心。

关于c++ - 为什么我的程序在 nVidia NView 下占用 100% CPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826870/

相关文章:

c++ - 存储类初始化的模板

ubuntu - 我可以在安装 CUDA 和 CUDNN 后更新我的 nvidia 驱动程序而不会弄乱我的 CUDA 安装吗?

ubuntu - 安装CUDA 8.0后在Ubuntu 17.04中没有声音

c++ - 如何使用对话框参数?

cuda - OSError : libcurand. so.10:无法打开共享对象文件:没有这样的文件或目录

c++ - ASIO (C++ 11) strand.post 在使用私有(private)成员函数时导致段错误

C++ OpenGL - 顶点颜色

c++ - 如何添加一个整数的所有数字直到它是一位数字?

C++ 代码探查器

.net - 如何查找 Windows 文件夹中的项目是否真的对用户隐藏?